我想先执行一段异步代码,如下,把 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 function |
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
|