【问题标题】:How can I make webpack skip a require我怎样才能让 webpack 跳过一个要求
【发布时间】:2016-04-22 02:08:10
【问题描述】:

如何让 webpack 跳过发生的

require('shelljs/global');

在我的源文件中?我想打包我的源文件,但将require('shelljs/global') 保留在文件中,而不是捆绑shelljs/global

【问题讨论】:

标签: node.js webpack


【解决方案1】:

如果将路径存储在变量中,则 IgnorePlugin 将不起作用。虽然你仍然可以这样做:

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

【讨论】:

【解决方案2】:

您可以使用Ignore Plugin (webpack 1) / Ignore plugin (webpack 2)

webpack.config.js中添加插件:

plugins: [
  new webpack.IgnorePlugin(/shelljs\/global/),
],

【讨论】:

    【解决方案3】:

    对于新手来说,在 webpack 2+ 上这样做的方式是这样的:

    module.exports = {
        entry: __dirname + '/src/app',
        output: {
            path: __dirname + '/dist',
            libraryTarget: 'umd'
        },
        externals: {
            'shelljs/globals': 'commonjs shelljs/global'
        }
    };
    

    捆绑包将包含逐字要求:

    require('shelljs/global');
    

    阅读更多支持的格式on webpack's config guide 和一些很好的例子here

    【讨论】:

    • 这仍然会重写require,但是Webpack会在外部寻找依赖。
    【解决方案4】:

    如果 require 在全局命名空间中,这就是为什么你希望 Webpack 忽略它,只需执行 window.require()

    【讨论】:

      【解决方案5】:

      这应该是最后的选择,但如果你确定你的 JS 文件总是被 Webpack 解析,而不是别的:

      你可以用__non_webpack_require__()替换你的require()调用

      Webpack 将解析和转换任何出现的 this 并输出一个正常的 require() 调用。这仅在您在 NodeJS 中执行或在浏览器中执行时才有效,前提是您有一个可触发的全局 require 库。

      如果 webpack 不解析文件,并且脚本由其他东西运行,那么您的代码将尝试调用未转换的 __non_webpack_require__,这将失败。如果__non_webpack_require__ 作为函数存在,您可能会编写一些代码来检查脚本的早期部分,如果不存在,则让它将调用传递给require。

      但是,这应该是暂时的,只是为了避免构建错误,直到您可以用 Webpack 自己的动态导入之类的东西替换它。

      【讨论】:

        【解决方案6】:

        这里有个技巧

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

        注意模板字符串的使用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-09-21
          • 1970-01-01
          • 1970-01-01
          • 2019-10-04
          • 2023-02-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多