mirror of
https://github.com/nodejs/node.git
synced 2024-11-21 10:59:27 +00:00
10099bb3f7
This patch: 1. Refactor the routines used to compile and run an embedder entrypoint. In JS land special handling for SEA is done directly in main/embedding.js instead of clobbering the CJS loader. Add warnings to remind users that currently the require() in SEA bundled scripts only supports loading builtins. 2. Don't use the bundled SEA code cache when compiling CJS loaded from disk, since in that case we are certainly not compiling the code bundled into the SEA. Use a is_sea_main flag in CompileFunctionForCJSLoader() (which replaces an unused argument) to pass this into the C++ land - the code cache is still read directly from C++ to avoid the overhead of ArrayBuffer creation. 3. Move SEA loading code into MaybeLoadSingleExecutableApplication() which calls LoadEnvironment() with its own StartExecutionCallback(). This avoids more hidden switches in StartExecution() and make them explicit. Also add some TODOs about how to support ESM in embedded applications. 4. Add more comments PR-URL: https://github.com/nodejs/node/pull/53573 Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com> Reviewed-By: Chengzhong Wu <legendecas@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
65 lines
2.6 KiB
JavaScript
65 lines
2.6 KiB
JavaScript
const { Module: { createRequire } } = require('module');
|
|
const createdRequire = createRequire(__filename);
|
|
|
|
// Although, require('../common') works locally, that couldn't be used here
|
|
// because we set NODE_TEST_DIR=/Users/iojs/node-tmp on Jenkins CI.
|
|
const { expectWarning, mustNotCall } = createdRequire(process.env.COMMON_DIRECTORY);
|
|
|
|
const builtinWarning =
|
|
`Currently the require() provided to the main script embedded into single-executable applications only supports loading built-in modules.
|
|
To load a module from disk after the single executable application is launched, use require("module").createRequire().
|
|
Support for bundled module loading or virtual file systems are under discussions in https://github.com/nodejs/single-executable`;
|
|
|
|
expectWarning('Warning', builtinWarning); // Triggered by require() calls below.
|
|
// This additionally makes sure that no unexpected warnings are emitted.
|
|
if (!createdRequire('./sea-config.json').disableExperimentalSEAWarning) {
|
|
expectWarning('ExperimentalWarning',
|
|
'Single executable application is an experimental feature and ' +
|
|
'might change at any time');
|
|
// Any unexpected warning would throw this error:
|
|
// https://github.com/nodejs/node/blob/c301404105a7256b79a0b8c4522ce47af96dfa17/test/common/index.js#L697-L700.
|
|
}
|
|
|
|
// Should be possible to require core modules that optionally require the
|
|
// "node:" scheme.
|
|
const { deepStrictEqual, strictEqual, throws } = require('assert');
|
|
const { dirname } = require('node:path');
|
|
|
|
// Checks that the source filename is used in the error stack trace.
|
|
strictEqual(new Error('lol').stack.split('\n')[1], ' at sea.js:29:13');
|
|
|
|
// Should be possible to require a core module that requires using the "node:"
|
|
// scheme.
|
|
{
|
|
const { test } = require('node:test');
|
|
strictEqual(typeof test, 'function');
|
|
}
|
|
|
|
// Should not be possible to require a core module without the "node:" scheme if
|
|
// it requires using the "node:" scheme.
|
|
throws(() => require('test'), {
|
|
code: 'ERR_UNKNOWN_BUILTIN_MODULE',
|
|
});
|
|
|
|
deepStrictEqual(process.argv, [process.execPath, process.execPath, '-a', '--b=c', 'd']);
|
|
|
|
strictEqual(require.cache, undefined);
|
|
strictEqual(require.extensions, undefined);
|
|
strictEqual(require.main, module);
|
|
strictEqual(require.resolve, undefined);
|
|
|
|
strictEqual(__filename, process.execPath);
|
|
strictEqual(__dirname, dirname(process.execPath));
|
|
strictEqual(module.exports, exports);
|
|
|
|
throws(() => require('./requirable.js'), {
|
|
code: 'ERR_UNKNOWN_BUILTIN_MODULE',
|
|
});
|
|
|
|
const requirable = createdRequire('./requirable.js');
|
|
deepStrictEqual(requirable, {
|
|
hello: 'world',
|
|
});
|
|
|
|
console.log('Hello, world! 😊');
|