๐์๋ ํ์ธ์๐
์๋ฐ์คํฌ๋ฆฝํธ๋ก ํ๋ก ํธ, ๋ฐฑ ๋ชจ๋ ์์ฑํ๋ค๋ณด๋ฉด ๋ชจ๋ ์ฌ์ฉ ๋ฐฉ์์ด ์์ฃผ ํท๊ฐ๋ฆฌ๊ณค ํ๋๋ฐ์,
์ฌ์ฉ๋ฒ์ ์ข ๋ ์๊ธฐ ์ฝ๊ฒ ๋จธ๋ฆฌ์์ ๋ฃ๊ธฐ์ํด ๊ฐ๊ฐ์ ํํธ๋ณ๋ก ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
์ด ๊ธ์ ๋ณด์๊ณ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ์์คํ ์ ๋ํด ์ฝ๊ฒ ์ดํด๊ฐ ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค!
CommonJS๋ ์น๋ธ๋ผ์ฐ์ ๋ฐ์ JavaScript๋ฅผ ์ํ ๋ชจ๋ ์ํ๊ณ์ ๊ท์น์ ์ค๋ฆฝํ๊ธฐ ์ํ ํ๋ก์ ํธ๋ผ๊ณ ํฉ๋๋ค.
์น๋ธ๋ผ์ฐ์ ๋ฐ์ JavaScript๋ผ ํ๋ฉด ๋ํ์ ์ผ๋ก Nodejs๊ฐ ์๊ฒ ๋ค์.
์์ํ์๋ฏ์ด, Nodejs๋ ๊ธฐ๋ณธ์ ์ผ๋ก CommonJS์ ๊ท์น์ ๋ฐ๋ฆ
๋๋ค.
CommonJS์ ๋ชจ๋ ์ ๊ณต ๋ฐฉ์์ ๋๊ฐ์ง๊ฐ ์์ต๋๋ค.
module.exports
์ exports
๋จผ์ , module
์ด๋ผ๋ ํค์๋๋ ๊ณต์ ๋ฌธ์์ ์๋์ ๊ฐ์ด ์ค๋ช
๋์ด์์ต๋๋ค.
ํ์ฌ ๋ชจ๋์ ๋ํ๋ด๋ ์์ ๋ณ์, ๋น ๊ฐ์ฒด๋ก ์ด๊ธฐํ ๋์ด์๋ ์ํ
์ฆ, module
์ ํ์ฌ ๋ชจ๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ์ผ์ข
์ ๋น Object({})๋ผ๋ ๋ป์
๋๋ค.
๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
module.exports = expression
์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ ๊ณง ๊ฐ์ด๊ธฐ ๋๋ฌธ์, ๊ฐ์ผ๋ก ํ์ฉ๋๋ ์ด๋ค ๊ฒ๋ exportํ ์ ์์ต๋๋ค.
// utils.js
const PI = 3.14;
module.exports.PI = PI;
// app.js
const utils = require('./utils');
console.log(utils.PI); // 3.14
module
์ด ์ผ์ข
์ ๊ฐ์ฒด๋ผ๊ณ ํ์๋ ๊ฒ ๊ธฐ์ตํ์์ฃ ?
๊ทธ๋ผ module.exports = 3.14
๋ก ๋ฐ๊พธ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
// utils.js
module.exports = 3.14;
// app.js
const utils = require('./utils');
console.log(utils); // 3.14
console.log(utils.PI); // undefined
์์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์๊ฑฐ์์. ๊ทธ๋ฅ ๊ฐ์ฒด๋ผ๊ณ ์๊ฐํ์๋ฉด ์ดํด๊ฐ ๋น ๋ฅด์ค๊ฒ๋๋ค!
๊ธฐ๋ณธ์ ์ผ๋ก exports
ํค์๋๋ module.exports
์ ๋น์ทํ ๋ฐฉ์์ผ๋ก ๋์ํฉ๋๋ค.
// ๐ utils.js
exports.PI = 3.14;
console.log(module.exports === exports); // true
console.log(exports); // { PI: 3.14 }
์ฆ exports
๋ module
๊ฐ์ฒด์ exports
๋ฅผ ์ฐธ์กฐํ๋ ํ์์ผ๋ก ์ด๋ฃจ์ด์ ธ์๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
module.exports = "done";
exports.phrase = "done";
console.log(module.exports); // ???
๊ทธ๋ผ ์์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์ด๋จ๊น์?
์ด ํฌ์คํ
์ ๋ณด๊ณ ๊ณ์ ๋ถ์ด๋ผ๋ฉด, Call By Reference์ ๋ํด ๋ค์ด๋ณด์
จ์ ๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์์ํ์
์ ๊ฐ์ ๊ธฐ์ตํ์ง๋ง, ์ฐธ์กฐํ์
์ ์ฃผ์๋ฅผ ๊ธฐ์ตํ๋ค๋ ๊ฒ, ๊ธฐ์ต๋์๋์??
exports
๋ modules.exports
๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์๋๋ฐ,
module.exports
๊ฐ ๊ฐ์ผ๋ก ๋ฎ์ด์์์ง๋ฉด exports
๊ฐ ์ฐธ์กฐํ๊ณ ์๋ ๊ฐ์ฒด๋ ๋ ์ด์ module.exports
์๋ ์ ํ ์๊ด์๋ ์น๊ตฌ๊ฐ ๋๊ฒ ์ฃ ?
์ด ๋๋ฌธ์, exports
๋ module.exports = expression
๊ณผ๋ ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋, module.exports.key = value
์ ๊ฐ์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๋ฉด ํจ๊ป ์ฌ์ฉํ ์ ์์ต๋๋ค.
var math = require('./math');
console.log(math.sum(1,2));
๊ฐ๋จํ์ฃ ?
๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก 4๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ์ปค๋ฒํ ์ ์์ต๋๋ค.
1. File Module
2. Folder as Module
3. node_modules
4. Global Directory
์๋๊ฒฝ๋ก์ ์๋ ํ์ผ ์ค ํ์ฅ์๊ฐ .js
, .json
, .node
์ธ ํ์ผ์ ๋ชจ๋๋ก์จ ๋ถ๋ฌ์ต๋๋ค. ํ์ฅ์๋ ์๋ตํ ์ ์์ต๋๋ค.
// data.json
{ "data": "Hello World!" }
// utils.js
module.exports.PI = 3.14
// app.js
const data = require('./data');
const utils = require('./utils');
console.log(data); // { data: "Hello World!" }
console.log(utils.PI); // 3.14
/
๋ก ์์ํ๋ฉด ์ ๋๊ฒฝ๋ก๋ก, ./
ํน์ ../
๋ก ์์ํ๋ค๋ฉด ์๋๊ฒฝ๋ก๋ก ์ฐพ์ต๋๋ค.
์๋ฌด๊ฒ๋ ์์ด ์์ํ ๊ฒฝ์ฐ์๋, node_modules
ํด๋์์ ์ฐพ์ต๋๋ค.
๊ฒฝ๋ก์์ ์ฐพ์ ์ ์์ ๊ฒฝ์ฐ์ require()
์ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋ฉฐ MODULE_NOT_FOUND
๋ผ๋ ์๋ฌ๋ช
์ด ๋ํ๋ ๊ฒ์
๋๋ค.
ํด๋๋ฅผ require()
๊ตฌ๋ฌธ์ ์ด์ฉํด importํ ๋๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
1. ๋๋ ํ ๋ฆฌ์ ๋ฃจํธ์ main๋ชจ๋์ ๋ช
์ํ package.json ํ์ผ์ ํตํ ๋ฐฉ๋ฒ
ex)
// package.json
{
"name": "DIY-library",
"main": "./lib/DIY-library"
}
package.jsonํ์ผ์ด ์๊ฑฐ๋, main ๋ชจ๋์ ์ํธ๋ฆฌํฌ์ธํธ๊ฐ ์์ ๋ ํน์ resolve๋์ง ์์ ๋,
๋ค์ ๋ฐฉ๋ฒ์ ๋ฐ๋ฆ
๋๋ค.
2. ๋๋ ํ ๋ฆฌ์์ index.js ๋ index.node ํ์ผ์ ์ฐพ์ต๋๋ค.
์์ ๋ฐฉ๋ฒ์ด ๋ชจ๋ ์คํจํ๋ฉด
Node.js๋ Error: Cannot find module 'Module_Name'
์ ์ถ๋ ฅํ ๊ฒ์
๋๋ค.
node_modules
require()
๋ก ๋๊ฒจ์ง ์ธ์๊ฐ ์ฝ์ด ๋ชจ๋(์ธ์ด ์์ฒด์ ๋ด์ฅ ๋ ๋ชจ๋)์ด ์๋๋ผ๋ฉด, ๊ทธ๋ฆฌ๊ณ /
, ./
, ../
๋ก ์์ํ์ง ์๋๋ค๋ฉด Node.js๋ ํ์ฌ ๋ชจ๋์ ์์ ๋๋ ํ ๋ฆฌ์ /node_modules
๋ฅผ ๋ถ์ด๊ณ ๊ทธ ์์น๋ถํฐ ๋ชจ๋์ ์ฐพ๊ธฐ ์์ํฉ๋๋ค.
์ฐพ์ง ๋ชปํ๋ฉด, ๋ ์์ ๋๋ ํ ๋ฆฌ๋ก, ํ์ผ์์คํ
์ ๋ฃจํธ๊ฒฝ๋ก(/
)์ ๋ฟ์ ๋๊น์ง ๋ฐ๋ณตํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๊ฒฝ๋ก๊ฐ /home/ry/projects/foo.js
์ธ ํ์ผ์์ require('bar.js')
๋ฅผ ํธ์ถํ์์ ๋, Node.js๋ ์๋์ ์์๋๋ก ๋ชจ๋์ ์ฐพ์ต๋๋ค.
/home/ry/projects/node_modules/bar.js
/home/ry/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js
๋ชจ๋์ด๋ฆ ๋ค์ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํด์ ํน์ ํ์ผ์ด๋ ์๋ธ๋ชจ๋์ ๋ถ๋ฌ์ฌ ์ ์์ต๋๋ค.
ex) require('DIY-library/path/to/file')
DIY-library
๋ฅผ ๋จผ์ ์ฐพ์๋ค์ path/to/file
์ ์๋๊ฒฝ๋ก๋ก์จ ์ ์ฉ๋ฉ๋๋ค.
์์ ๋์ด ๋ ๋ฐฉ๋ฒ๋ค๋ก ๋ชจ๋์ ์ฐพ์ ์ ์๊ณ , NODE_PATH
ํ๊ฒฝ ๋ณ์๊ฐ ์ฝ๋ก (:)์ผ๋ก ๋ถ๋ฆฌ๋ ์ ๋๊ฒฝ๋ก์ ๋ชฉ๋ก์ ์ค์ ๋์ด์๋ค๋ฉด Node.js๋ ๊ทธ ๊ฒฝ๋ก์์ ๋ชจ๋์ ์ฐพ์ต๋๋ค.
Windows์ ๊ฒฝ์ฐ์๋ ์ฝ๋ก ๋์ ์ธ๋ฏธ์ฝ๋ก (;)์ ๋๋ค.
NODE_PATH
๋ ํ์ฌ์ Module resolution ์๊ณ ๋ฆฌ์ฆ์ด ์ ๋ฆฝ๋๊ธฐ ์ ์ ๋ชจ๋ ๋ก๋๋ฅผ ์ง์ํ๊ธฐ ์ํ์ฌ ๋ง๋ค์ด์ก๋ค๊ณ ํฉ๋๋ค.
NODE_PATH
๋ ์ฌ์ ํ ์ง์๋๋ ์ค์ด๋ฉฐ, NODE_PATH
์ค์ ๋๋ค๋ ์ ์ ๋ํด์ ์ฃผ์ํ์ง ์์ผ๋ฉด, ํ๋ก๊ทธ๋จ์ด ์๋์น ์์ ๋์์ ํ ์ ๋ ์์ต๋๋ค. ๋ชจ๋์ NODE_PATH
์์ ๊ฐ์ ธ์ค๊ฒ๋๊ฑฐ๋ํ์ฌ ๋ค๋ฅธ ๋ฒ์ , ํน์ ์์ ๋ค๋ฅธ ๋ชจ๋์ด ๋ก๋ ๋ ์๋ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
์ถ๊ฐ์ ์ผ๋ก, ์๋ ๋ชฉ๋ก์ ์ ์ญ ๋๋ ํ ๋ฆฌ์์ ๋ชจ๋์ ์ฐพ์ต๋๋ค.
1. $HOME/.node_modules
2. $HOME/.node_libraries
3. $PREFIX/lib/node
$HOME
์ ์ฌ์ฉ์์ home ๋๋ ํ ๋ฆฌ, $PREFIX
๋ Node.js์์ ์ค์ ํ node_prefix
์
๋๋ค.
Asynchronous Module Definition์ ์ฝ์๋ก์จ, ๋น๋๊ธฐ์ ๋ชจ๋ ์ ์ธ์ด๋ผ๋ ๋ป์
๋๋ค.
AMD๋ ๋ชจ๋ ์ ์ธ์ ๋ฐฉ๋ฒ๋ก ์ด๊ณ , ์ด๊ฒ์ ๊ตฌํํ ๋ํ์ ์ธ ๋ชจ๋ ์์คํ
์ Require.js์
๋๋ค.
ํด๋ผ์ด์ธํธ ์ฌ์ด๋์์ ๋ชจ๋์ ๋ก๋ฉํ ๋, ์คํฌ๋ฆฝํธ ํ๊ทธ๋ฅผ ์ด์ฉํด์ ๋ก๋ฉํ๋ ๊ฒ์, ๋ก๋ฉ์ด ์๋ฃ๋ ๋๊น์ง ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฆฌ์ง๋์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์์ข์ ์ํฅ์ ๋ผ์ณค์ต๋๋ค. ๊ทธ๋์ ๋น๋๊ธฐ์ ์ผ๋ก ๋ชจ๋ ๋ก๋ฉ์ ํ ํ์๊ฐ ์์๊ธฐ ๋๋ฌธ์ ํ์ด๋ฌ์ต๋๋ค.
ํ์ง๋ง! ์ด์ ์ ํ์ด๋ ๋ฐฐ๊ฒฝ์ด ๊ทธ๋ฌ๋ ๊ฒ์ด์ง, ์ต๊ทผ์๋ ๋์์ด ์กด์ฌํฉ๋๋ค.
๊ทธ๋๋ ์ผ๋จ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋์ด์ผ๊ฒ ์ฃ โ
<!-- index.html -->
<html>
...
<script src="require.js"></script>
<script src="app.js"></script>
...
</html>
// myModule.js
define(['jquery', 'math'], function($, Math) {
console.log($);
console.log(Math);
return {
a: $,
b: Math,
}
});
์ฒซ๋ฒ์งธ ์ธ์์๋ ๊ฐ์ ธ์ฌ ๋ชจ๋ ์ด๋ฆ์ ๋ฐฐ์ด, ๋๋ฒ์งธ ์ธ์์๋ ์ฝ๋ฐฑํจ์๋ฅผ ๋ฃ์ผ๋ฉด ๋ฉ๋๋ค.
์ด๋ ๊ฒ ๋ง๋ ๋ชจ๋ require
ํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
require(['myModule'], function(mod){
console.log(mod.a) // jquery
console.log(mod.b) // Math
});
ESM์ ES6๋ถํฐ ์ง์๋๋ ์๋ฐ์คํฌ๋ฆฝํธ ์์ฒด ๋ชจ๋ ์์คํ
์
๋๋ค.
HTML ํ์ผ์์ ์ง์ ๊ฐ์ ธ์ค๋ ์ฝ๋๋ ์๋์ ๊ฐ์ด ์์ฑํฉ๋๋ค.
<html>
//...
<script type="module" src="lib.mjs"></script>
<script type="module" src="app.mjs"></script>
//...
</html>
ES6๋ชจ๋ ํ์ผ์ ํ์ฅ์๋ ๋ชจ๋์์ ๋ช ํํ๊ฒ ํ๊ธฐ ์ํด mjs๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๋ค์!
๊ทธ๋ผ js ํ์ผ ๋ด์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ๊น์?
๋ชจ๋๋ฐ์ผ๋ก ๋ด๋ณด๋ผ ๋๋ export
ํค์๋๋ฅผ ์ด์ฉํฉ๋๋ค.
// module.mjs
export const pi = Math.PI;
export function square(x){
return x * x;
}
export class Person {
constructor(name) {
this.name = name;
}
}
์ฐจ๋ก๋ก ๋ณ์, ํจ์, ํด๋์ค๋ฅผ ๋ด๋ณด๋ด๋ ๋ฐฉ๋ฒ์
๋๋ค. ๊ฐ๋จํ์ฃ ?
๋๋ ํ๋ฒ์ ๋ชจ์์ ๋ด๋ณด๋ด๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค.
// module.mjs
const pi = Math.PI;
function square(x) {
return x * x;
}
class Person {
constructor(name) {
this.name = name;
}
}
export { pi, square, Person };
๋ชจ๋์ ๊ฐ์ ธ์ฌ ๋๋ import
ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
export
๋ ์๋ณ์๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์ค๋ฉฐ ํ์ฅ์๋ ์๋ต ๊ฐ๋ฅํฉ๋๋ค(mjs).
// app.mjs
import { pi, square, Person } from './module.mjs';
console.log(pi); // 3.14...
console.log(square(10)); // 100
console.log(new Person('Lee')); Person { name: 'Lee' }
์ด๋ค๊ฐ์? ์ ๊ฐ ๋๋ผ๊ธฐ์ ๋ค๋ฅธ ๋ชจ๋ ์์คํ ๋ณด๋ค ํจ์ฌ ์ง๊ด์ ์ด๊ณ ๊น๋ํด๋ณด์ด๋ค์๐
ํ๋ฒ์ ๋ด๋ณด๋ด๋ ๋ฐฉ๋ฒ์ด ์์์ผ๋ ํ๋ฒ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ๋ ์๊ฒ ์ฃ ?
// app.js
import * as lib from './module.mjs';
console.log(lib.pi);
console.log(lib.square(10));
console.log(new lib.Person('Lee'));
์ด๋ ๊ฒํ๋ฉด export๋ ๋ฐ์ดํฐ๋ค์ ํ๋ฒ์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค!
๋, ๊ฐ์ ธ์ค๋ฉด์ ์์ ์ด ์ํ๋ ์ด๋ฆ์ผ๋ก ๋ณ๊ฒฝํด์ ๊ฐ์ ธ์ฌ ์๋ ์์ต๋๋ค.
// app.js
import { pi as PI, square as sq, Person as P } from './module.mjs';
console.log(PI);
console.log(sq(2));
console.og(new P('Lee'));
ํ๋์ ๋ฐ์ดํฐ๋ง์ exportํ ๋๋ default
ํค์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
// module.mjs
export default function (x) {
return x * x;
}
deafult
ํค์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ var, let, const๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
// module.mjs
export default () => {}; // OK
export default const foo = () => {}; // Error
default
ํค์๋๋ก export๋ ๋ชจ๋์ {} ์์ด ์์์ ์ด๋ฆ์ผ๋ก import
ํฉ๋๋ค.
// module.mjs
import square from './module.mjs';
console.log(square(3)); // 9
UMD๋ AMD, CommonJS, window์ ์ถ๊ฐํ๋ ๋ฐฉ์์๊น์ง ๋ชจ๋ ์ ์ฉํ ์ ์๋ ๋ชจ๋ ํจํด์
๋๋ค.
AMD๋ define, CommonJS๋ module.exports๋ฅผ ์ฌ์ฉํ๋ค๋ ์ ์ ์ด์ฉํ๋ ๊ฒ์
๋๋ค.
// module.js
(function(root, factory){
if (typeof define === 'function' && define.amd) {
define(['jquery', 'myModule'], factory); // require.js
} else if (typeof module === 'object' && module.exports) {
module.exports = factory(require('jquery'), require('myModule')); // CommonJS
} else {
root.myModule = factory(root.$, root.mod); // window
}
}(this, function($, mod) {
return {
a: $,
b: mod,
};
});
์ด๋ ๊ฒ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฌ๋ฌ ๋ชจ๋ ์์คํ
์ ๋ํด ์์๋ณด์์ต๋๋ค!
์ ์ตํ ์๊ฐ์ด์
จ๋์? ์ด ํฌ์คํธ๊ฐ ์ฌ๋ฌ๋ถ์ด ๋ชจ๋ ์์คํ
์ ๋ํด ์ดํดํ์๋๋ฐ ๋์์ด ๋์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค. ๋ค์ ํฌ์คํ
์์ ๋ ๋ง๋์๐