NodeJS 为什么这段代码不等待模块的导入?

wwodge7n  于 2023-03-22  发布在  Node.js
关注(0)|答案(1)|浏览(161)

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
我不明白为什么/为什么会出错。

bmp9r5qi

bmp9r5qi1#

正如其他人已经在评论中建议的那样,这种执行模式被称为IIFE:

(async () => { /* ... */ })();

由于它是异步的,所以它不会“等待”直到完成,而是与后面的代码并行执行。
如果您希望某些操作按顺序发生,则必须将该部分也包含在async环境中,或者将文件命名为something.mjs,以便可以在顶层使用await

相关问题