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:
package.json
Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ output/
:{
"dependencies": {
"vm2": "latest"
}
}
vm2
ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Webpack:externals: {
"vm2": "require('vm2')"
}
output/
ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Webpack Π·Π°Π²Π΅ΡΡΠΈΡ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ:"scripts": {
"prepare-output": "cd output && npm install",
"prepare": "webpack --progress && npm run prepare-output"
}
ΠΡΠΈΠ²Π΅Ρ !
Π£ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΈ Π²ΠΎΡ ΠΊΠ°ΠΊ Ρ Π΅Π΅ ΡΠ΅ΡΠΈΠ»:
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Ρ Π½Π΅ ΠΌΠΎΠ³Ρ Π½Π°ΠΏΡΡΠΌΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠΎΠ΄ΡΠ»Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΌΠΎΠ΄ΡΠ»Ρ npm, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ Ρ c / c lib Π² ΠΏΠ°ΠΏΠΊΠ΅ ΠΌΠΎΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° (ΡΡΠΎ Π²ΡΠ΅Π³ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ², Ρ ΡΡΠΈΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½Π΅Ρ)
Π fs Π΄Π»Ρ sandbox.js / contexttify.js: Ρ ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π» ΠΈΡ Π² sandbox.txt ΠΈ contexttify.txt, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» raw-Π·Π°Π³ΡΡΠ·ΡΠΈΠΊ, ΡΡΠΎΠ±Ρ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΠΈΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠ΅ΠΊΡΡ.
main.js (Π²Π²Π΅ΡΡ Ρ)
const sb = require('./sandbox.txt');
const cf = require('./contextify.txt');
webpack.config.js
{
test: /\.txt$/,
use: 'raw-loader'
}
ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π²ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ sandbox.js / contexttify.js Π½Π° sandbox.txt / contexttify.txt Π² main.js.
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 - ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ Ρ Webpack 5 Ρ ΡΠ΅Π»Π΅Π²ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ node
ΠΏΠΎΡ
ΠΎΠΆΠ΅, ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΡΡΡ Π»ΠΈ ΠΏΡΠΎΠ³ΡΠ΅ΡΡ ΠΏΠΎ ΡΡΠΎΠΌΡ Π²ΠΎΠΏΡΠΎΡΡ? ΠΠΎΡ Π»ΡΡΡΠΈΠΉ ΠΈ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΡΠ°ΠΌΡΠΉ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ΄Π΅Π»Π°ΡΡ
vm2
ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡΠΌ ΡWebpack
. ΠΠ΅ ΡΡΠ΅Π±ΡΠ΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΡΠ°ΠΌΠΎΠΌvm2
, Π²ΡΠ΅Π³ΠΎ 3 ΡΡΡΠΎΠΊΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΠΈ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΊΡΠΈΠΏΡ NPM:package.json
Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅output/
:vm2
ΠΊΠ°ΠΊ Π²Π½Π΅ΡΠ½ΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Webpack:output/
ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Webpack Π·Π°Π²Π΅ΡΡΠΈΡ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ: