V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yazoox
V2EX  ›  webpack

webpack.config.js 在 exports 配置之前,能先执行一段异步代码到?

  •  
  •   yazoox · 2022-03-24 18:34:18 +08:00 · 931 次点击
    这是一个创建于 763 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想先执行一段异步代码,如下,把 commitHash 写入到 process.env 里面去,然后再返回 webpack 的配置:

    async function getLastCommitHash() {
      return new Promise(resolve => {
          require('child_process').exec('git rev-parse HEAD', function(err, stdout) {
            resolve(stdout);
          });
      }
    }
    
    const run = async () => {
    const commit = await getLastCommitHash();
    return
        {
          ...
          plugins:       new webpack.DefinePlugin({
                "process.env": commit
              })
    
        }
    }
    
    

    我参考了一下这里的做法: https://stackoverflow.com/questions/53991856/how-do-i-await-a-piece-of-code-within-weback-config

    module.exports = run(); 或者
    module.exports = run; 貌似都不行。

    这,有没有办法,在 webpack.config.js 里面,先执行一段异步代码再返回配置呢?

    11 条回复    2022-03-25 13:30:20 +08:00
    Biwood
        1
    Biwood  
       2022-03-24 20:08:53 +08:00
    官方文档写的是可以直接 return 一个 Promise 对象,不过只能作用于 webpack-cli ,无法用 webpack 函数式接收这类配置。

    https://v4.webpack.js.org/configuration/configuration-types/#exporting-a-promise
    waiaan
        2
    waiaan  
       2022-03-25 09:05:44 +08:00
    可不可以先执行你的异步代码,把结果放到全局变量里,然后再运行 webpack 。
    yazoox
        3
    yazoox  
    OP
       2022-03-25 09:40:43 +08:00
    @Biwood
    thx. 这个方法可以工作。
    yazoox
        4
    yazoox  
    OP
       2022-03-25 09:46:45 +08:00
    @Biwood
    btw, 兄弟,我碰到这个问题后,也 google 了半天,找了官方文档, stackoverflow 看。但最终没有“定位”到你提到的那篇文章。
    你是怎么搜索,通过什么关键字,或者思路,找到这个答案的?还是说,你以前 /本来就知道,只是找了官方文档分享出来?
    谢谢!
    duan602728596
        5
    duan602728596  
       2022-03-25 10:37:29 +08:00
    其实是可以的,关键词:Top-level await
    yazoox
        6
    yazoox  
    OP
       2022-03-25 10:44:09 +08:00
    @duan602728596
    试过了,不行啊 ~ 我们的 node 是 14.17 ,webpack version 是 4.44 版本

    const commitId = await getLastCommitHash();
    ^^^^^
    SyntaxError: await is only valid in async function
    duan602728596
        7
    duan602728596  
       2022-03-25 10:53:24 +08:00
    @yazoox Top-level await 只支持 ESM 模块
    Biwood
        8
    Biwood  
       2022-03-25 11:11:27 +08:00 via iPhone
    @yazoox 我回去看了下搜索记录,我用的关键词是“webpack module export async”,第一条结果就是了,了。还有就是我自己的习惯,永远先看官方文档,原版文档没提到的再看 github/stackoverflow 等等,顺着这个思路能解决 90%的问题。
    yazoox
        9
    yazoox  
    OP
       2022-03-25 11:13:00 +08:00
    @duan602728596
    看了一下官方文档,webpack 4.5 以上版本就支持了。( https://github.com/webpack/webpack-cli/releases/tag/webpack-cli%404.5.0)
    不过,这个工作量有点大。有空试试
    谢谢
    yazoox
        10
    yazoox  
    OP
       2022-03-25 11:15:13 +08:00
    @Biwood thx. ;-)
    duan602728596
        11
    duan602728596  
       2022-03-25 13:30:20 +08:00
    @yazoox 所以你才需要把 webpack.config.js 修改为 webpack.config.mjs
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4796 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 09:55 · PVG 17:55 · LAX 02:55 · JFK 05:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.