当nodejs
服务器处于development
环境中时,我尝试动态导入模块。我为此创建了一个立即调用的async
函数,理论上应该可以工作,但它根本没有工作。导入模块后的其余代码在不等待导入完成的情况下运行。
服务器.js
import express from 'express'; // standard import
if (process.env.NODE_ENV === 'development') {
// IIFE to dynamically import modules required in dev
(
async () => {
try {
console.log(`About to import`)
//simple destructuring used to get the default export out of the modules
const {default: webpack} = await import('webpack');
const {default: webpackDevMiddleware} = await import('webpack-dev-middleware');
console.log(`FIRST: typeof webpack ${typeof Webpack} | typeof webpackdevmiddleware ${typeof WebpackDevMiddleware}`)
} catch (error) {
console.log(error)
}
})();
}
const server = express();
if (process.env.NODE_ENV === 'development') {
// Need to use imported modules here but this code does not wait for the webpack imports above to finish
console.log(`SECOND: I must run after FIRST`)
}
....
server.listen(PORT, () => {
console.log(`Server is listening on port 8080`);
});
当我运行server.js
代码时,我按以下顺序得到以下输出:
即将导入
第二名:我必须跟在第一名后面
服务器正在侦听端口8080
第一:webpack函数的类型|webpackdevmiddleware函数类型
正确的顺序应该是:
即将导入
第一:webpack函数的类型|webpackdevmiddleware函数类型
第二名:我必须跟在第一名后面
服务器正在侦听端口8080
我不明白为什么/为什么会出错。
1条答案
按热度按时间bmp9r5qi1#
正如其他人已经在评论中建议的那样,这种执行模式被称为IIFE:
由于它是异步的,所以它不会“等待”直到完成,而是与后面的代码并行执行。
如果您希望某些操作按顺序发生,则必须将该部分也包含在
async
环境中,或者将文件命名为something.mjs
,以便可以在顶层使用await
。