如何让webpack跳过require语句

32

我该如何使webpack跳过某些出现的内容?

require('shelljs/global');

我想打包我的源文件,但保留文件中的require('shelljs/global'),而不将shelljs/global打包。


通过使用target: 'node',解决了我的问题,https://webpack.github.io/docs/configuration.html - Thomas Andersen
7个回答

35

如果您将路径存储在变量中,则 IgnorePlugin 将无法正常工作。但是,您仍然可以执行以下操作:

const myCustomModule = eval('require')(myCustomPath)

1
简单而有效。 - heinob
4
警告:应避免使用eval。只有在您知道并理解风险时才使用它。否则,请寻找其他解决方案。请阅读Google或此处的更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval - redfox05
针对这个特定的用例,我认为没有必要担心,并且我声称这是最干净的解决方案,特别是如果代码也将在没有Webpack的情况下执行,因为它适用于两者(与此处的其他建议相反)。使用'require'字面量来提供eval不会引入任何风险。 - Ercksen

24

对于新手,在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配置指南中的内容以及一些好的例子这里


这将仍然重写 require,但是 Webpack 会在外部查找依赖项。 - Cobertos

23

7

这应该是最后的救命稻草,但如果您确定您的JS文件总是由Webpack解析而不是其他:

您可以将require()调用替换为__non_webpack_require__()

Webpack会解析并转换任何此类发生,并输出一个正常的require()调用。这仅在NodeJS中执行或在浏览器中具有全局require库可用以触发时才起作用。

如果webpack没有解析文件,并且脚本由其他东西运行,则您的代码将尝试调用未转换的__non_webpack_require__,这将失败。您可以潜在地编写一些代码,在脚本早期检查__non_webpack_require__是否存在作为函数,如果不存在,则将其传递给require。

然而,这只是暂时的,只是为了避免构建错误,直到您可以将其替换为类似于Webpack自己的动态导入之类的内容。


7

如果require在全局命名空间中,这就是你希望Webpack忽略它的原因,只需执行window.require()即可。


3

这里有一个技巧

const require = module[`require`].bind(module);

注意使用模板字符串


1

如果某些文件包含嵌套的 requires,而您想要忽略它们,您可以告诉 webpack 不对这些特定文件进行解析。 例如,如果 swiper.jsvue-quill-editor.js 包含内部 requires,则可以按照以下方式忽略它们。

module.exports = {
  module: {
    noParse: [
     /swiper.js/,/quill/
    ],

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接