// mergeScripts.js 파일 내용
// 사용자 정의 모듈 'modules/combineJS.js' 호출
var combineJS = require('./modules/combineJS.js');
// combineJS 모듈 사용
combineJS();
## Note
Node.js는 ES6를 '부분적'으로 지원합니다.
그래서 ES6에서 제공하는 모듈기능은 사용하지 못합니다. (import, export)
그래서 여전히 commonJS에서 제공하는 모듈 기능인 require 함수를 사용해야합니다.
Node.js에서 ES6의 모듈(import, export)을 읽게하려면 babel이라는 추가 환경세팅을 해야됩니다.
이 부분은 다음에 해보도록 하겠습니다.
// modules/combineJS.js 파일 내용
// combineJS 모듈 정의
function combineJS(){
console.log('combineJS 모듈');
}
그리고 mergeScripts.js 파일이 있는 곳에서
위와 같이 TypeError가 나는 이유는 mergeScripts.js 파일에서 combineJS를 호출해오지 못하기 때문입니다.
// modules/combineJS.js 파일 내용
// combineJS 모듈 정의
function combineJS(){
console.log('combineJS 모듈');
}
// combineJS 모듈 외부로 출력 (Exports)
module.exports = combineJS;
위의 소스를 아래처럼도 쓸 수 있습니다.
// modules/combineJS.js 파일 내용
// combineJS 모듈 외부로 출력 (Exports)
module.exports = function (){
console.log('combineJS 모듈');
};
// modules/combineJS.js 파일 내용
// File System 내장 모듈 호출
var fs = require('fs');
/*
* combineJS 모듈 정의 및 외부로 출력
* 모듈 내부에 전달받을 인자(배열, 문자열) 설정
*/
module.exports = function(jsSrc, exportJs){
console.log(jsSrc, exportJs);
}
그리고 mergeScripts.js 파일도 다음과 같이 수정합니다.
// mergeScripts.js 파일 내용
// 사용자 정의 모듈 'modules/combineJS.js' 호출
var combineJS = require('./modules/combineJS.js');
/*
* combineJS 모듈 사용
* 전달인자 1 : 병합하고자 하는 JS 파일 리스트(배열)
* 전달인자 2 : 병합되어 생성된 파일 경로(문자열)
* */
combineJS(['./script1.js', './script2.js'], './jsCombine.js');
첫번째 인자로 전달받은 배열 아이템(병합할 개별 자바스크립트 파일)마다 코드를 적용할 수 있도록 배열 객체를 제어할 수 있는
forEach() 함수를 사용했습니다.
// modules/combineJS.js 파일 내용
// File System 내장 모듈 호출
var fs = require('fs');
/*
* combineJS 모듈 정의 및 외부로 출력
* 모듈 내부에 전달받을 인자(배열, 문자열) 설정
*/
module.exports = function(jsSrc, exportJs){
// 배열 jsSrc를 개별적으로 접근 조작하기 위해
// forEach 배열 메소드 사용
jsSrc.forEach(function(file, index){
console.log(file, index);
});
}
// modules/combineJS.js 파일 내용
// File System 내장 모듈 호출
var fs = require('fs');
/*
* combineJS 모듈 정의 및 외부로 출력
* 모듈 내부에 전달받을 인자(배열, 문자열) 설정
*/
module.exports = function(jsSrc, exportJs){
// 배열 jsSrc를 개별적으로 접근 조작하기 위해
// forEach 배열 메소드 사용
jsSrc.forEach(function(file, index){
var content = fs.readFileSync(file);
console.log('콘텐츠: \n' + content);
});
}
// modules/combineJS.js 파일 내용
// File System 내장 모듈 호출
var fs = require('fs');
/*
* combineJS 모듈 정의 및 외부로 출력
* 모듈 내부에 전달받을 인자(배열, 문자열) 설정
*/
module.exports = function(jsSrc, exportJs){
var mergeCode = '';
// 배열 jsSrc를 개별적으로 접근 조작하기 위해
// forEach 배열 메소드 사용
jsSrc.forEach(function(file, index){
// fs.readFileSync() 사용하여 파일 내용 읽기
mergeCode += fs.readFileSync(file);
});
console.log(mergeCode);
}
// modules/combineJS.js 파일 내용
// File System 내장 모듈 호출
var fs = require('fs');
/*
* combineJS 모듈 정의 및 외부로 출력
* 모듈 내부에 전달받을 인자(배열, 문자열) 설정
*/
module.exports = function(jsSrc, exportJs){
var mergeCode = '';
// 배열 jsSrc를 개별적으로 접근 조작하기 위해
// forEach 배열 메소드 사용
jsSrc.forEach(function(file, index){
// fs.readFileSync() 사용하여 파일 내용 읽기
mergeCode += fs.readFileSync(file);
});
fs.writeFileSync(exportJs, mergeCode);
}
그리고 다음 명령어로 minify 모듈을 설치합니다.
npm install --save minify
npm i -S minify
minify 모듈이 설치되면, 다음을 참고하여 minify 모듈을 호출하는 코드와 minify() 모듈을 사용하는 코드를 입력합니다.
// modules/combineJS.js 파일 내용
const fs = require('fs'),
minify = require('minify'),
options = {
html: {
removeAttributeQuotes: false,
removeOptionalTags: false
},
};
module.exports = function(jsSrc, exportJs){
jsSrc.forEach(function(file, index){
minify(file, options)
.then(console.log)
.catch(console.error);
});
}
// modules/combineJS.js 파일 내용
// File System 내장 모듈 호출
var fs = require('fs'),
minify = require('minify');
module.exports = function (jsSrc, exportJs) {
var mergeCode = '';
jsSrc.forEach(function (file, index) {
minify(file).then(function (data) {
mergeCode += data;
if (index == jsSrc.length - 1) {
writeFile();
}
});
});
function writeFile() {
fs.writeFileSync(exportJs, mergeCode);
}
};
// mergeScripts.js 파일 내용
// 사용자 정의 모듈 'modules/combineJS.js' 호출
var combineJS = require('./modules/combineJS.js');
/*
* combineJS 모듈 사용
* 전달인자 1 : 병합하고자 하는 JS 파일 리스트(배열)
* 전달인자 2 : 병합되어 생성된 파일 경로(문자열)
* */
combineJS(['./script1.js', './script2.js'], './jsCombine.js', true);
// modules/combineJS.js 파일 내용
// File System 내장 모듈 호출
var fs = require('fs'),
minify = require('minify');
module.exports = function (jsSrc, exportJs, min) {
var mergeCode = '',
len = jsSrc.length - 1,
compress = min;
jsSrc.forEach(function (file, index) {
if (compress) {
minify(file).then(function (data) {
mergeCode += data;
if (index == len) {
writeFile();
}
});
} else {
mergeCode += fs.readFileSync(file);
if (index == len) {
writeFile();
}
}
});
function writeFile() {
fs.writeFileSync(exportJs, mergeCode);
}
};
combineJS.js 파일이름을 index.js로 바꾸고 combineJS 폴더를 생성하여 그 안으로 넣습니다.
배포하기전 package.json을 통해 정보를 담을 수 있습니다.
npm adduser 명령어로 본인 npm 계정과 비밀번호, 이메일을 입력합니다.
npm publish 명령어로 모듈을 배포합니다.
아래와 같이 모듈이 배포된것을 확인할 수 있습니다.
require 부분을 다시 확인하면서 mergeScripts 파일을 위에서 작성한대로 작성한 후