高级配置项

状态:草稿

output.publicPath

一般情况下,用上面的配置就能搞定了。但如果你的网站稍大一点,可能需要引入CDN,而且很可能CDN还有一些很古怪的前缀,这个时候可以通过output.publicPath来搞定。

例如,在前面的例子中,输出的脚本路径是dist/example4.1.js,而在生产环境中访问的时候却有可能是http://cdn.toobug.net/scripts/webpack_guide/dist/example4.1.js。这种情况下,就需要使用output.publicPath来将前面的路径补全:

  1. output:{
  2. publicPath:'http://cdn.toobug.net/scripts/webpack_guide/'
  3. }

这样发布到生产环境以后,就会到CDN上对应的路径去加载脚本了。

这个选项适用于各种非入口文件的场景,包括分片后的文件、loader加载文件时的路径、css中引入的图片资源文件路径等等。

output.libraryoutput.libraryTargetoutput.umdNamedDefine

如我们在前面很多例子中看到的那样,webpack在打包的时候会将entry中配置的文件打包成一个在浏览器中直接运行的文件,也即我们前面定义过的“入口文件”。而如果我们想要的并不是入口文件,而是一个可供其它脚本再引用的类库要怎么办呢?此时就可以用output.libraryoutput.libraryTarget来告诉webpack,我们想要的打包结果是一个类库。

todo:介绍一下入口文件和类库一般有什么区别

首先看output.library,它被用来指定模块的名字,就像jQuery,它的模块名叫jquery,至于这个名字有什么用,马上就会看到。我们在后文中都以{Library}来代替它的值。

output.libraryTarget,它的意思是指定打包后的脚本如何导出模块。前面我们介绍过模块化规范,有AMD、CommonJS、UMD以及直接定义变量等等。这个选项即是指定用哪种方式来对模块内容进行导出。

它的可选项如下:

  • ‘var’ 通过var {Library} = xxx;的方式导出模块,即定义(隐性)全局变量
  • ‘this’ 通过this[{Library}] = xxx;的方式导出模块,其中this一般指向window,也是定义全局变量
  • ‘commonjs’ 通过指定exports属性的方式导出模块,例如exports[{Library}] = xxx;,引用的时候需要require('xxx.js')[{Library}]才能引用到xxx
  • ‘commonjs2’ 通过指定module.exports的方式导出模块,例如module.exports = xxx;,引用的时候直接使用require('xxx.js')即可引用到xxx