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

2022-03-24 18:34:18 +08:00
 yazoox

我想先执行一段异步代码,如下,把 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 里面,先执行一段异步代码再返回配置呢?

948 次点击
所在节点    webpack
11 条回复
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
2022-03-25 09:05:44 +08:00
可不可以先执行你的异步代码,把结果放到全局变量里,然后再运行 webpack 。
yazoox
2022-03-25 09:40:43 +08:00
@Biwood
thx. 这个方法可以工作。
yazoox
2022-03-25 09:46:45 +08:00
@Biwood
btw, 兄弟,我碰到这个问题后,也 google 了半天,找了官方文档, stackoverflow 看。但最终没有“定位”到你提到的那篇文章。
你是怎么搜索,通过什么关键字,或者思路,找到这个答案的?还是说,你以前 /本来就知道,只是找了官方文档分享出来?
谢谢!
duan602728596
2022-03-25 10:37:29 +08:00
其实是可以的,关键词:Top-level await
yazoox
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
2022-03-25 10:53:24 +08:00
@yazoox Top-level await 只支持 ESM 模块
Biwood
2022-03-25 11:11:27 +08:00
@yazoox 我回去看了下搜索记录,我用的关键词是“webpack module export async”,第一条结果就是了,了。还有就是我自己的习惯,永远先看官方文档,原版文档没提到的再看 github/stackoverflow 等等,顺着这个思路能解决 90%的问题。
yazoox
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
2022-03-25 11:15:13 +08:00
@Biwood thx. ;-)
duan602728596
2022-03-25 13:30:20 +08:00
@yazoox 所以你才需要把 webpack.config.js 修改为 webpack.config.mjs

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/842684

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX