我该如何使webpack跳过某些出现的内容?
require('shelljs/global');
我想打包我的源文件,但保留文件中的require('shelljs/global')
,而不将shelljs/global
打包。
如果您将路径存储在变量中,则 IgnorePlugin 将无法正常工作。但是,您仍然可以执行以下操作:
const myCustomModule = eval('require')(myCustomPath)
对于新手,在webpack 2+中实现这个的方法如下:
module.exports = {
entry: __dirname + '/src/app',
output: {
path: __dirname + '/dist',
libraryTarget: 'umd'
},
externals: {
'shelljs/globals': 'commonjs shelljs/global'
}
};
捆绑包将包含一个逐字的 require:
require('shelljs/global');
阅读更多支持的格式,请查看webpack配置指南中的内容以及一些好的例子这里
webpack.config.js
中添加插件:plugins: [
new webpack.IgnorePlugin(/shelljs\/global/),
],
这应该是最后的救命稻草,但如果您确定您的JS文件总是由Webpack解析而不是其他:
您可以将require()
调用替换为__non_webpack_require__()
Webpack会解析并转换任何此类发生,并输出一个正常的require()
调用。这仅在NodeJS中执行或在浏览器中具有全局require库可用以触发时才起作用。
如果webpack没有解析文件,并且脚本由其他东西运行,则您的代码将尝试调用未转换的__non_webpack_require__
,这将失败。您可以潜在地编写一些代码,在脚本早期检查__non_webpack_require__
是否存在作为函数,如果不存在,则将其传递给require。
然而,这只是暂时的,只是为了避免构建错误,直到您可以将其替换为类似于Webpack自己的动态导入之类的内容。
如果require
在全局命名空间中,这就是你希望Webpack忽略它的原因,只需执行window.require()
即可。
这里有一个技巧
const require = module[`require`].bind(module);
注意使用模板字符串
如果某些文件包含嵌套的 requires,而您想要忽略它们,您可以告诉 webpack 不对这些特定文件进行解析。 例如,如果 swiper.js 和 vue-quill-editor.js 包含内部 requires,则可以按照以下方式忽略它们。
module.exports = {
module: {
noParse: [
/swiper.js/,/quill/
],