coffee-script
require๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ์์ ๋ด
๋๋ค.๋ ๋ค๋ฅธ ๋ฌธ์ ๋ require
์
๋๋ค. webpack์ ๋ค์ ์๊ตฌ ์ฌํญ์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ์์ฑํ์ง๋ง :
WARNING in ./~/vm2/lib/main.js
147:26-33 Critical dependency: require function is used in a way in which dependencies cannot be statically extracted
WARNING in ./~/vm2/lib/main.js
251:3-10 Critical dependency: require function is used in a way in which dependencies cannot be statically extracted
WARNING in ./~/vm2/lib/main.js
295:26-33 Critical dependency: require function is used in a way in which dependencies cannot be statically extracted
webpack์ ์ค์ ๋ก require
๋ฅผ exceptions
๋ก ๋์ฒดํ์ต๋๋ค.
์๋ฅผ ๋ค์ด, webpack ์ ์ :
Reflect.defineProperty(this, '_internal', {
value: vm.runInContext(`(function(require, host) { ${cf} \n})`, this._context, {
filename: `${__dirname}/contextify.js`,
displayErrors: false
}).call(this._context, require, host)
});
์นํฉ ์ดํ :
Reflect.defineProperty(this, '_internal', {
value: vm.runInContext(`(function(require, host) { ${cf} \n})`, this._context, {
filename: `${__dirname}/contextify.js`,
displayErrors: false
}).call(this._context, !(function webpackMissingModule() { var e = new Error("Cannot find module \".\""); e.code = 'MODULE_NOT_FOUND'; throw e; }()), host)
});
require
๋ฅผ eval('require')
๋ฐ๊พธ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ๋ ๋์ ํด๊ฒฐ์ฑ
์ด ์๋์ง ๊ถ๊ธํฉ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ์ง์ ์ด ์์ต๋๊น? ๋ค์์ vm2
๋ฅผ Webpack
์ ํธํ๋๋๋ก ๋ง๋๋ ๊ฐ์ฅ ์ข๊ณ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์
๋๋ค. vm2
์์ฒด๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ผ๋ฉฐ 3 ์ค์ ์ถ๊ฐ ๊ตฌ์ฑ๊ณผ ๊ฐ๋จํ NPM ์คํฌ๋ฆฝํธ ๋ง ์์ผ๋ฉด๋ฉ๋๋ค.
output/
๋๋ ํฐ๋ฆฌ์ package.json
์ ๋ง๋ญ๋๋ค.{
"dependencies": {
"vm2": "latest"
}
}
vm2
๋ฅผ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ์ํฉ๋๋ค.externals: {
"vm2": "require('vm2')"
}
output/
๋๋ ํฐ๋ฆฌ์ ์ข
์์ฑ์ ์ค์นํ๋ ์ถ๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ NPM์ ์ถ๊ฐํฉ๋๋ค."scripts": {
"prepare-output": "cd output && npm install",
"prepare": "webpack --progress && npm run prepare-output"
}
์๋ ํ์ธ์ !
๋๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์๊ณ ์ฌ๊ธฐ์ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง๊ฐ ์์ต๋๋ค.
์ฒซ์งธ, ์์ค๋ฅผ ์์ ํด์ผํ๊ธฐ ๋๋ฌธ์ ๋ชจ๋์ npm ๋ชจ๋๋ก ์ง์ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ๋ด ํ๋ก์ ํธ์ ํด๋์์ lib๋ฅผ c / c๋ก ์ฒ๋ฆฌํฉ๋๋ค (ํ์ผ ๋ช ๊ฐ์ ๋ถ๊ณผํ๋ฏ๋ก ๋ฌธ์ ์์).
sandbox.js / contextify.js์ fs ์ ๋ณด : sandbox.txt ๋ฐ contextify.txt๋ก ์ด๋ฆ์ ๋ฐ๊พผ ๋ค์ ์์ ๋ก๋๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ ํ ์คํธ๋ก๋ก๋ํ์ต๋๋ค.
main.js (์๋จ)
const sb = require('./sandbox.txt');
const cf = require('./contextify.txt');
webpack.config.js
{
test: /\.txt$/,
use: 'raw-loader'
}
sandbox.js / contextify.js์ ๋ชจ๋ ์ฐธ์กฐ๋ฅผ main.js์ sandbox.txt / contextify.txt๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ์์ง ๋ง์ญ์์ค.
main.js (์ฝ 250 ํ)
[...]
const host = {
version: parseInt(process.versions.node.split('.')[0]),
require: eval('require'),
process,
console,
[...]
๋๋ "require"๋ฅผ "require : eval ( 'require')"๋ก ๋ณ๊ฒฝํ์ฌ webpack์ด ์์ ํ์ง ์๊ณ (Coxxs์์ ์ ์ํ๋๋ก) ํธ๋ฆญ์ ์ํํ์ต๋๋ค.
์ด์ vm2๋ฅผ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉํ ํ์์์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋งค์ฐ ๊น๋ค ๋กญ๊ณ ๊นจ๋ํ์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ง๊ธ๊น์ง ๋ด๊ฐ ์ป์ ์ ์ผํ ํด๊ฒฐ์ฑ
์
๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๋น์ ์ค ์ผ๋ถ๋ฅผ ๋์ธ ์ ์๊ณ ๋ํ ์ค์ ์์ ์ ๋์์ด๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ ๋์ ์๋ฃจ์ ์ด ์๋ค๋ฉด ๋ฃ๊ณ ์ถ์ต๋๋ค! :)
์ด ๋ฌธ์ ๋ ์ต๊ทผ ํ๋์ด ์์๊ธฐ ๋๋ฌธ์ ์๋์ผ๋ก ์ค๋๋ ๊ฒ์ผ๋ก ํ์๋์์ต๋๋ค. ๋ ์ด์ ํ๋์ด ๋ฐ์ํ์ง ์์ผ๋ฉด ํ์๋ฉ๋๋ค. ๊ทํ์ ๊ธฐ์ฌ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
FWIW-๋์์ด node
Webpack 5์ ๋ฒ๋ค๋ง์ด ์๋ํ๋ ๊ฒ์ผ๋ก ๋ณด์
๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด ๋ฌธ์ ์ ๋ํ ์ง์ ์ด ์์ต๋๊น? ๋ค์์
vm2
๋ฅผWebpack
์ ํธํ๋๋๋ก ๋ง๋๋ ๊ฐ์ฅ ์ข๊ณ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋๋ค.vm2
์์ฒด๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์์ผ๋ฉฐ 3 ์ค์ ์ถ๊ฐ ๊ตฌ์ฑ๊ณผ ๊ฐ๋จํ NPM ์คํฌ๋ฆฝํธ ๋ง ์์ผ๋ฉด๋ฉ๋๋ค.output/
๋๋ ํฐ๋ฆฌ์package.json
์ ๋ง๋ญ๋๋ค.vm2
๋ฅผ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ์ํฉ๋๋ค.output/
๋๋ ํฐ๋ฆฌ์ ์ข ์์ฑ์ ์ค์นํ๋ ์ถ๊ฐ ์คํฌ๋ฆฝํธ๋ฅผ NPM์ ์ถ๊ฐํฉ๋๋ค.