NodeJs 의 Express 및 Webuploader 를 기반 으로 큰 파일 분할 업로드 와 통합 (2) - 구성 요소 화 실현
현재 브 라 우 저 에서 비교적 유행 하 는 것 은 Requirejs 이기 때문에 이 편 은 Requirejs 와 결합 하여 기능 을 더욱 구성 합 니 다.
사실 Requirejs 를 이용 하여 이전의 기능 을 개조 하 는 것 은 비교적 쉽다. Requirejs 공식 문서 에 따 르 면 다음 과 같은 몇 가지 단계 가 있다.
1) Requirejs 를 다운로드 합 니 다.
2) view 템 플 릿 파일 에서 이전의 js 인용 방식 을 개조 합 니 다.
3) 원래 의 논리 적 기능 을 하나의 구성 요소 로 추상 화하 고 페이지 에서 호출 된 Requirejs 통일 입구 파일 에서 호출 하면 된다.
다음은 2, 3 단계 에 대해 자세히 소개 하 겠 습 니 다. 모든 코드 는 제 GitHub 개발 지점 을 보십시오.
두 번 째 단 계 는 간단 합 니 다. 코드 를 붙 이기 전에 upload. jade 가 개 조 된 코드 입 니 다. 그 중에서 html dom 부분 은 변 하지 않 고 여러 script 을 requirejs 로 도입 하 는 방식 만 바 꿉 니 다.
extends ../layout/front
block content
link(rel="stylesheet" type="text/css" href="plugins/webuploader/webuploader.css")
link(rel="stylesheet" type="text/css" href="css/front/upload.css")
#uploader.wu-example
.dndArea
.file-select
#picker
p
//
#thelist.uploader-list
button#ctlBtn.btn.btn-default
script(src="js/require-2.1.11.min.js" defer async="true" data-main="js/front/upload.js")
3 단계 가 중요 하고 관건 이다.먼저 추상 적 인 논리 기능 은 하나의 구성 요소 입 니 다. 이 세 계 는 requirejs 의 config 를 미리 정의 해 야 합 니 다. 저 는 js / front / upload. js 에 썼 고 구성 요소 의 디 렉 터 리 구 조 를 조정 하여 설정 을 붙 였 습 니 다.requirejs.config({
baseUrl: 'js',
paths: {
jquery: 'jquery-1.8.3.min',
webuploader: '../plugins/webuploader/webuploader',
md5: 'md5.min',
}
});
그 다음 에 추상 적 인 개조 기능 을 Requirejs 의 구성 요소 로 해 야 한다. 개조의 사고방식 은 js 의 prototype 원형 모델 을 참고 했다. 구체 적 인 원형 모델 은 나의 다른 문장 인 자바 스 크 립 트 가 대상 을 대상 으로 프로 그래 밍 하 는 봉인 (一) 을 참고 할 수 있다.원형 모드 의 기본 프레임 워 크 (세트) 는 다음 과 같다.
function ClassName(a, b)
{
this.xxx = a;
this.yyy = b;
}
ClassName.prototype.zzz = function() {
console.log('zzz');
};
var obj = new ClassName('x', 'y');
원형 모드 에 따라 구성 요 소 를 패키지 하여 업로드 합 니 다.define(['jquery', 'md5', 'webuploader'], function ($, md5, WebUploader) {
/**
*
* @constructor
*/
function Uploader() {
//------------- -------------
this.config = {};
this.uploader = {};
}
// ------------- --------------
// ( )
Uploader.prototype.init = function (cfg) {
if (!this.support()) {
return false;
}
//------------- -------------
var _config = {
// , 。
auto: false,
// swf
swf: '../../webuploader/Uploader.swf',
// 。
server: '/upload_chunks',
// 。 。
// , input , flash.
pick: {
id: '#picker',
label: ' '
},
//
compress: false,
//
dnd: '.dndArea',
disableGlobalDnd: false,
// 。 document.body
paste: document.body,
//
chunked: true,// 。
chunkSize: Math.pow(1024, 2),// (Byte)
threads: 1,//
// image, jpeg, !
resize: false
};
//----------------- -----------------
//
function _initConfig(cfg) {
this.config = $.extend(_config, cfg);
this.uploader = WebUploader.create(this.config);
}
//
function _initEvent() {
var that = this;
//
this.uploader.on('fileQueued', function (file) {
var $list = $(".uploader-list");
var item = '' +
'' +
'' + file.name + '
' +
' ...
' +
'' +
'';
$list.append(item);
});
// ,
this.uploader.on('uploadStart', function (file) {
that.uploader.options.formData.guid = md5([file.id, file.name, file.size, file.type, file['__hash']].join(''));
});
// 。
this.uploader.on('uploadProgress', function (file, percentage) {
var $li = $('#' + file.id),
$percent = $li.find('.progress .progress-bar');
//
if (!$percent.length) {
var progress = '' +
'';
$percent = $(progress).prependTo($li).find('.progress-bar');
}
$li.find('p.state').text(' ');
$percent.css('width', percentage * 100 + '%');
});
this.uploader.on('uploadSuccess', function (file) {
// console.log(file);
// , Get url
if (that.uploader.options.chunked) {
$.post('/merge_chunks', {
'hash': md5([file.id, file.name, file.size, file.type, file['__hash']].join('')),
'name': file.name,
'size': file.size
}, function (data) {
if (data.status) {
$('#' + file.id).find('p.state').text(' ');
$('#' + file.id).find('.progress-bar').css({
'background-image': 'url(' + data.url + ')',
'background-size': 'cover',
'background-repeat': 'no-repeat'
});
} else {
$('#' + file.id).find('p.state').text(' !');
}
}, 'json');
}
});
this.uploader.on('uploadError', function (file) {
$('#' + file.id).find('p.state').text(' ');
});
this.uploader.on('uploadComplete', function (file) {
// $('#' + file.id).find('.progress').fadeOut();
});
}
_initConfig.apply(this, [cfg]);
_initEvent.apply(this);
};
//
Uploader.prototype.support = function () {
try {
if (!WebUploader.Uploader.support()) {
alert('Web Uploader ! IE , flash ');
throw new Error('WebUploader does not support the browser you are using.');
}
return true;
} catch (e) {
if (e instanceof Error) {
console.error(e.message);
} else {
console.error('Error!');
}
return false;
}
};
//
Uploader.prototype.startUpload = function () {
if (!this.support()) {
return false;
}
this.uploader.upload();
};
return new Uploader();
}); ' +
'
여기 서 개인 속성 과 방법 으로 초기 화 되 었 고 Webuploader 인 스 턴 스 를 패키지 류 의 공공 속성 으로 합 니 다.다음은 이 구성 요 소 를 호출 해 보 겠 습 니 다. upload. js 에 쓰 겠 습 니 다.
requirejs(['modules/uploader'], function (Uploader) {
Uploader.init({
pick: {
id: '#picker',
label: ' '
},
threads: 2,
});
$('#ctlBtn').on('click', function (event) {
event.stopPropagation();
Uploader.startUpload();
});
});
그 중에서 Uploader. init 방법 도 전달 하지 않 아 도 된다.이로써 전체적인 기능 모듈 화 개조 가 끝 났 는 지 상대 적 으로 간단 한 지 관건 은 모듈 화 구성 요소 의 실현 에 있다.
또한, 당신 은 더 좋 은 패 키 징 모듈 화 구성 요소 방식 이 있 을 지도 모 릅 니 다. 저 는 교 류 를 참고 하 시기 바 랍 니 다. 잘못된 점 은 신 들 이 많이 지적 해 주 십시오.