我想先执行一段异步代码,如下,把 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 里面,先执行一段异步代码再返回配置呢?
![]() | 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 |
![]() | 2 waiaan 2022-03-25 09:05:44 +08:00 可不可以先执行你的异步代码,把结果放到全局变量里,然后再运行 webpack 。 |
![]() | 4 yazoox OP @Biwood btw, 兄弟,我碰到这个问题后,也 google 了半天,找了官方文档, stackoverflow 看。但最终没有“定位”到你提到的那篇文章。 你是怎么搜索,通过什么关键字,或者思路,找到这个答案的?还是说,你以前 /本来就知道,只是找了官方文档分享出来? 谢谢! |
![]() | 5 duan602728596 2022-03-25 10:37:29 +08:00 其实是可以的,关键词:Top-level await |
![]() | 6 yazoox OP @duan602728596 试过了,不行啊 ~ 我们的 node 是 14.17 ,webpack version 是 4.44 版本 const commitId = await getLastCommitHash(); ^^^^^ SyntaxError: await is only valid in async funcion |
![]() | 7 duan602728596 2022-03-25 10:53:24 +08:00 @yazoox Top-level await 只支持 ESM 模块 |
![]() | 8 Biwood 2022-03-25 11:11:27 +08:00 via iPhone @yazoox 我回去看了下搜索记录,我用的关键词是“webpack module export async”,第一条结果就是了,了。还有就是我自己的习惯,永远先看官方文档,原版文档没提到的再看 github/stackoverflow 等等,顺着这个思路能解决 90%的问题。 |
![]() | 9 yazoox OP @duan602728596 看了一下官方文档,webpack 4.5 以上版本就支持了。( https://github.com/webpack/webpack-cli/releases/tag/webpack-cli%404.5.0) 不过,这个工作量有点大。有空试试 谢谢 |
![]() | 11 duan602728596 2022-03-25 13:30:20 +08:00 @yazoox 所以你才需要把 webpack.config.js 修改为 webpack.config.mjs |