Webpack和外部库

Dav*_*ing 48 javascript require commonjs webpack

我正在尝试使用webpack(http://webpack.github.io/)并且它看起来非常好,但是我有点被困在这里.

假设我正在使用CDN作为库,f.ex jQuery.然后在我的代码中,我希望require('jquery')自动指向全局jquery实例,而不是尝试从我的模块中包含它.

我尝试过使用类似的插件IgnorePlugin:

new webpack.IgnorePlugin(new RegExp("^(jquery|react)$"))
Run Code Online (Sandbox Code Playgroud)

这适用于忽略库,但它仍然表示当我运行webpacker时所需的模块"丢失".

不知怎的,我需要告诉webpack jquery应该从全局上下文中获取.看起来像一个常见的用例,所以我很惊讶文档没有具体针对这一点.

小智 72

根据Webpack文档,您可以使用externals配置对象上的属性"来指定库的依赖关系,这些依赖关系不是由webpack解析的,而是成为输出的依赖关系.这意味着它们是在运行时[sic]从环境中导入的. "

该页面上的示例使用jQuery很好地说明了这一点.简而言之,您可以在普通的CommonJS样式中使用jQuery:

var jQuery = require('jquery');
Run Code Online (Sandbox Code Playgroud)

然后,在您的配置对象中,使用该externals属性将jQuery模块映射到全局jQuery变量:

{
    externals: {
        // require("jquery") is external and available
        //  on the global var jQuery
        "jquery": "jQuery"
    }
}
Run Code Online (Sandbox Code Playgroud)

由Webpack创建的结果模块将只导出现有的全局变量(为简洁起见,我省略了很多内容):

{
    1: function(...) {
        module.exports = jQuery;
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了这个,它的工作原理与描述一致.

  • 刚尝试使用UMD输出,它不起作用.相反,它输出需要('jQuery')的代码,由于模块名称是'jquery'而不是'jQuery',因此失败了.我不明白这个功能应该如何工作. (12认同)
  • 对于 UMD,您必须传入一个对象,该对象为每个模块类型提供不同的字符串。例如 `{ amd: 'jquery', global: 'jQuery', commonjs: 'jquery' }` 那里的确切属性可能是错误的,但应该是一个很好的引导,让任何人在未来都能做到这一点。 (2认同)
  • 哇,有可能让UMD使用不同的名字,如@Adam A所说,但正确的属性是:`amd`,`commonjs`,`commonjs2`和`root`!这样你就可以:`externals:{jquery:{amd'jquery',root:'$',commonjs:'jquery',commonjs2:'jquery'}}` (2认同)
  • @CalebHearon 这是很酷的语法,但我希望我可以做这样的事情 `externals: {jquery: {commonjs2: 'global.jQuery'}}` 但不幸的是,这仍然会导致 `module.exports = require('global. jQuery');`,我只是在 `commonjs2` 目标构建中寻找 `module.exports = global.jQuery;` 的非 commonjs 行为。任何想法,我尝试了“NormalModuleReplacementPlugin”但没有运气 (2认同)