[译]webpack官网文档 :指南 -- 14.辅助
原创翻译,转载请注明出处。
原文地址:https://webpack.js.org/guides/shimming/
Webpack作为一个模块打包工具,能识别由ES2015模块,CommonJS或AMD编写的模块。但是有时候,使用第三方库的时候,它们期望有些依赖是全局可用的,给jquery定义别名$。它们也可能会创建用来导出的全局变量。这里我们会看到几种帮助webpack识别这些零碎模块的方式。
#相对于被打包的dist版本,更喜欢未压缩的CommonJS/AMD文件
很多模块在package.json的main字段里指定dist版本的链接。虽然这可能对大多数的开发者有利,但是对于webpack最好指定到src版本,因为这样的话,webpack能更好的优化依赖。不管怎样多数情况下dist版本也工作的很好。
// webpack.config.js module.exports ={ ... resolve:{ alias:{ jquery:"jquery/src/jquery" } } };
ProvidePlugin
ProvidePlugin插件可以把一个模块像一个变量一样,提供给webapck请求的所有模块。只有当你使用这个变量的时候,这个模块才会被请求。一些既有的模块使用一些已经存在的特定的全局变量,像jQuery插件使用$或jQuery。这种情境下,你可以通过配置webpack,每一个使用全局$标识符的地方,都会先执行var $ = require(“jquery”)。
module.exports ={ plugins:[ newwebpack.ProvidePlugin({ $:'jquery', jQuery:'jquery' }) ] };
这个插件还可以通过配置一个格式为[module, child, ...children?]的路径数组,导出特定的模块。下面的配置就可以从TypeScript的tslib包里引入__assign函数,不管在哪里都可以使用它。
module.exports ={ plugins:[ newwebpack.ProvidePlugin({ __assign:['tslib','__assign'], __extends:['tslib','__extends'], }) ] };
imports-loader
imports-loader可以在请求的既存模块里插入必要的全局变量,一些既存的模块把this作为window对象。当这种模块在CommonJS上下文环境里执行的时候会发生问题,this等同于module.exports。这种情况下可以使用imports-loader来复写this。
webpack.config.js
module.exports ={ module:{ rules:[{ test: require.resolve("some-module"), use:'imports-loader?this=>window' }] } };
一些模块支持不同的模块类型,像AMD,CommonJS和既存默认的。多数情况下他们先检查define,然后用一些复杂的代码导出变量。在这种情况下,可以设定define=false来强制设定CommonJS路径。
webpack.config.js
module.exports ={ module:{ rules:[{ test: require.resolve("some-module"), use:'imports-loader?define=>false' }] } };
exports-loader
一个库创建了一些它认为用户会使用的全局变量,这种情况下,我们可以使用exports-loader,在CommonJS格式下导出全局变量。例如为了以file导出file,以parse导出helpers.parse:
webpack.config.js
module.exports ={ module:{ rules:[{ test: require.resolve("some-module"), use:'exports-loader?file,parse=helpers.parse' // adds below code the file's source: // exports["file"] = file; // exports["parse"] = helpers.parse; }] } };
script-loader
Script-loader在全局上下文里提供代码,就像你把代码加到script标签里一样。这种模式下,每一个普通的库应该都适用。require,module等还不确定。
假设你有一个legacy.js文件,包含:
GLOBAL_CONFIG ={};
使用script-loader…
require('script-loader!legacy.js');
基本用法:
eval("GLOBAL_CONFIG = {};");
noParse选项
当没有AMD或者CommonSJ版本的模块的前提下,你还想引入dist,你可以把模块标记成noParse。这样webpack就只是引入模块而不解析它,这样可以提高编译时间。
module.exports ={ module:{ noParse:/jquery|backbone/ } };
-- End --