我想在webpack构建中尝试require
模块,如果找不到该文件,则不要做任何事情,不要抛出错误等。
我试过这样做:
try {
const local = require('./config-local.js');
extend(config, local);
} catch (err) {
// do nothing here
}
基本上我想要做的是使用本地配置扩展配置对象(如果找到该文件但是不是只是不用任何扩展它。)
Webpack抛出一个错误,即模块丢失,即使这个require包含在try / catch子句中。
如何告诉webpack忽略它?
答案 0 :(得分:1)
Webpack 尝试将您的每一个需求捆绑到输出文件中。它进行静态分析,找到一个需求并尝试读取它。你的 try&catch 只能在运行时工作。
您需要做的就是将此要求“标记”为特殊要求。
你可以使用 webpack 的特殊要求来实现:__ webpack_require__
答案 1 :(得分:0)
我认为略有不同的方法可能会为您提供所需的结果。您提到问题文件是应用程序配置。我将在webpack.config.js
中而不是在应用程序代码中进行处理。您的require
将遵循普通的nodeJS规则,而不是webpack的静态分析。您可以尝试/捕获require语句,然后在应用程序将使用的最终配置上登陆,然后使用DefinePlugin
将配置注入到应用程序中。 IMO这样使用DefinePlugin
(带有来自静态文件或env变量的数据)是将配置注入到webpack构建的应用程序中的更常见模式。
// load config data
const defaultConfig = require("default-config.json");
let localConfig = {};
try {
localConfig = require("config-that-may-not-exist.json");
} catch (err) {}
const actualConfig = Object.assign(defaultConfig, localConfig);
// ...later, in plugins part of config:
plugins: [
new webpack.DefinePlugin(actualConfig)
]
答案 2 :(得分:0)
根据@trysis 评论,我最终在我的项目中这样做了:
const REQUIRE_TERMINATOR = '';
try {
const local = require(`./config-local.js${REQUIRE_TERMINATOR}`);
extend(config, local);
} catch (err) {
// do nothing here
}
这将为 WebPack 提供足够的信息以包含所有以 config-local.js
开头的文件(这正是您想要的文件),但也会对其造成足够的混淆,以至于它不会尝试提前验证文件的存在,所以你的 try/catch 块会在运行时触发。