webpack学习笔记--配置output
Output
output 配置如何输出最终想要的代码。 output 是一个 object ,里面包含一系列配置项,下面分别介绍它们。
filename
output.filename 配置输出文件的名称,为string 类型。 如果只有一个输出文件,则可以把它写成静态不变的:
filename: 'bundle.js'
但是在有多个 Chunk 要输出时,就需要借助模版和变量了。前面说到 Webpack 会为每个 Chunk取一个名称,可以根据 Chunk 的名称来区分输出的文件名:
filename: '[name].js'
代码里的 [name] 代表用内置的 name 变量去替换 [name] ,这时你可以把它看作一个字符串模块函数, 每个要输出的 Chunk 都会通过这个函数去拼接出输出的文件名称。
内置变量除了 name
还包括:
变量名 | 含义 |
---|---|
id | Chunk 的唯一标识,从0开始 |
name | Chunk 的名称 |
hash | Chunk 的唯一标识的 Hash 值 |
chunkhash | Chunk 内容的 Hash 值 |
其中 hash 和 chunkhash 的长度是可指定的, [hash:8] 代表取8位 Hash 值,默认是20位。
注意 ExtractTextWebpackPlugin 插件是使用 contenthash
来代表哈希值而不是 chunkhash
, 原因在于 ExtractTextWebpackPlugin 提取出来的内容是代码内容本身而不是由一组模块组成的 Chunk。
chunkFilename
output.chunkFilename 配置无入口的 Chunk 在输出时的文件名称。 chunkFilename 和上面的 filename 非常类似,但 chunkFilename 只用于指定在运行过程中生成的 Chunk 在输出时的文件名称。 常见的会在运行时生成 Chunk 场景有在使用 CommonChunkPlugin、使用 import('path/to/module')
动态加载等时。 chunkFilename 支持和 filename 一致的内置变量。
path
output.path
配置输出文件存放在本地的目录,必须是 string 类型的绝对路径。通常通过 Node.js 的 path
模块去获取绝对路径:
path: path.resolve(__dirname, 'dist_[hash]')
publicPath
在复杂的项目里可能会有一些构建出的资源需要异步加载,加载这些异步资源需要对应的 URL 地址。
output.publicPath
配置发布到线上资源的 URL 前缀,为string 类型。 默认值是空字符串 ''
,即使用相对路径。
这样说可能有点抽象,举个例子,需要把构建出的资源文件上传到 CDN 服务上,以利于加快页面的打开速度。配置代码如下:
filename:'[name]_[chunkhash:8].js'
publicPath: 'https://cdn.example.com/assets/'
这时发布到线上的 HTML 在引入 JavaScript 文件时就需要:
<script src='https://cdn.example.com/assets/a_12345678.js'></script>
使用该配置项时要小心,稍有不慎将导致资源加载404错误。
output.path
和 output.publicPath
都支持字符串模版,内置变量只有一个:hash
代表一次编译操作的 Hash 值。
crossOriginLoading
Webpack 输出的部分代码块可能需要异步加载,而异步加载是通过 JSONP 方式实现的。 JSONP 的原理是动态地向 HTML 中插入一个 <script src="url"></script>
标签去加载异步资源。output.crossOriginLoading
则是用于配置这个异步插入的标签的 crossorigin
值。
script 标签的 crossorigin 属性可以取以下值:
anonymous
(默认) 在加载此脚本资源时不会带上用户的 Cookies;use-credentials
在加载此脚本资源时会带上用户的 Cookies。
通常用设置 crossorigin 来获取异步加载的脚本执行时的详细错误信息。
libraryTarget 和 library
当用 Webpack 去构建一个可以被其他模块导入使用的库时需要用到它们。
output.libraryTarget
配置以何种方式导出库。output.library
配置导出库的名称。
它们通常搭配在一起使用。
output.libraryTarget
是字符串的枚举类型,支持以下配置。
var (默认)
编写的库将通过 var
被赋值给通过 library
指定名称的变量。
假如配置了 output.library='LibraryName'
,则输出和使用的代码如下:
// Webpack 输出的代码
var LibraryName = lib_code; // 使用库的方法
LibraryName.doSomething();
假如 output.library
为空,则将直接输出:
lib_code
其中lib_code
代指导出库的代码内容,是有返回值的一个自执行函数。
commonjs
编写的库将通过 CommonJS 规范导出。
假如配置了 output.library='LibraryName'
,则输出和使用的代码如下:
// Webpack 输出的代码
exports['LibraryName'] = lib_code; // 使用库的方法
require('library-name-in-npm')['LibraryName'].doSomething();
其中 library-name-in-npm
是指模块发布到 Npm 代码仓库时的名称。
commonjs2
编写的库将通过 CommonJS2 规范导出,输出和使用的代码如下:
// Webpack 输出的代码
module.exports = lib_code; // 使用库的方法
require('library-name-in-npm').doSomething();
CommonJS2 和 CommonJS 规范很相似,差别在于 CommonJS 只能用
exports
导出,而 CommonJS2 在 CommonJS 的基础上增加了module.exports
的导出方式。
在 output.libraryTarget
为 commonjs2
时,配置 output.library
将没有意义。
this
编写的库将通过 this
被赋值给通过 library
指定的名称,输出和使用的代码如下:
// Webpack 输出的代码
this['LibraryName'] = lib_code; // 使用库的方法
this.LibraryName.doSomething();
window
编写的库将通过 window
被赋值给通过 library
指定的名称,即把库挂载到 window
上,输出和使用的代码如下:
// Webpack 输出的代码
window['LibraryName'] = lib_code; // 使用库的方法
window.LibraryName.doSomething();
global
编写的库将通过 global
被赋值给通过 library
指定的名称,即把库挂载到 global
上,输出和使用的代码如下:
// Webpack 输出的代码
global['LibraryName'] = lib_code; // 使用库的方法
global.LibraryName.doSomething();
libraryExport
output.libraryExport
配置要导出的模块中哪些子模块需要被导出。 它只有在 output.libraryTarget
被设置成 commonjs
或者 commonjs2
时使用才有意义。
假如要导出的模块源代码是:
export const a=1;
export default b=2;
现在你想让构建输出的代码只导出其中的 a
,可以把 output.libraryExport
设置成 a
,那么构建输出的代码和使用方法将变成如下:
// Webpack 输出的代码
module.exports = lib_code['a']; // 使用库的方法
require('library-name-in-npm')===1;
以上只是
output
里常用的配置项,还有部分几乎用不上的配置项没有一一列举,你可以在 Webpack 官方文档 上查阅它们。
webpack学习笔记--配置output的更多相关文章
- webpack学习笔记--配置总结
从前面的配置看来选项很多,Webpack 内置了很多功能. 你不必都记住它们,只需要大概明白 Webpack 原理和核心概念去判断选项大致属于哪个大模块下,再去查详细的使用文档. 通常你可用如下经验去 ...
- webpack学习笔记--配置entry
Entry entry 是配置模块的入口,可抽象成输入,Webpack 执行构建的第一步将从入口开始搜寻及递归解析出所有入口依赖的模块. entry 配置是必填的,若不填则将导致 Webpack ...
- webpack学习笔记--配置devServer
devServer 1-6 使用DevServer 介绍过用来提高开发效率的 DevServer ,它提供了一些配置项可以改变 DevServer 的默认行为. 要配置 DevServer ,除了在配 ...
- webpack学习笔记--配置plugins
Plugin Plugin 用于扩展 Webpack 功能,各种各样的 Plugin 几乎让 Webpack 可以做任何构建相关的事情. 配置 Plugin Plugin 的配置很简单, plugi ...
- webpack学习笔记--配置resolve
Resolve Webpack 在启动后会从配置的入口模块出发找出所有依赖的模块,Resolve 配置 Webpack 如何寻找模块所对应的文件. Webpack 内置 JavaScript 模块化语 ...
- webpack学习笔记--配置module
Module module 配置如何处理模块. 配置 Loader rules 配置模块的读取和解析规则,通常用来配置 Loader.其类型是一个数组,数组里每一项都描述了如何去处理部分文件. 配置 ...
- Docker学习笔记 — 配置国内免费registry mirror
Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror
- webpack学习笔记—webpack安装、基本配置
文章结构: 什么是webpack? 安装webpack 'webpack基本配置 一.什么是webpack? 在学习react时发现大部分文章都是react和webpack结合使用的,所以在学reac ...
- 【原】webpack学习笔记
之前在react的项目中有用过webpack,不过没有认真的去研究,这段时间又重新好好的学习一下webpack,发觉 webpack是一个很强大的东西.而且很好用,方便,接下来主要是做一下学习的笔记 ...
随机推荐
- 高效获得Linux函数调用栈/backtrace的方法【转】
转自:https://blog.csdn.net/littlefang/article/details/42295803 有四种方法可以获得Linux的函数调用堆栈,参见CALL STACK TRAC ...
- 巧用这19条MySQL优化【转】
1.EXPLAIN 做MySQL优化,我们要善用EXPLAIN查看SQL执行计划. 下面来个简单的示例,标注(1.2.3.4.5)我们要重点关注的数据: type列,连接类型.一个好的SQL语句至少要 ...
- 待解决输入istream_iterator
山寨版 istream_iterator 输入 第一行是整数t,表示有t组数据,每组数据一行,三个整数加两个字符串.字符串是不含空格的. 输出 对每组数据,输出二行,在第一行输出第一个数,第二行原样输 ...
- Flask组件
组件踩坑记录 : 先注册组件在使用配置(...) flask-script Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shel ...
- UPS不间断电源工作原理简述
原文地址:https://blog.csdn.net/uamix/article/details/52776297 一.定义 UPS即不间断电源,是将蓄电池(多为铅酸免维护蓄电池)与主机相连接,通过主 ...
- struts2框架学习之第三天
day03 上传下载 1 上传下载组件介绍 l jspSmartUpload(model1的年代): l apache-commons-fileupload,Struts2默认上传组 ...
- P1262 间谍网络 (tarjan缩点 水过去)
题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...
- ubuntu安装 opencv-3.4.3
1 .官网(https://opencv.org/releases.html)下载下源码 opencv-3.4.3.zip 2.解压 unzip opencv-3.4.3.zip 3.cmake c ...
- iperf3 不支持双工模式
iperf 2.05的时候,客户端可以使用参数"-d"来进行双工测试,先测试发送,client向server发送数据,等到测试时间结束后(默认为10s,可以通过-t选项来更改),然 ...
- $Django cbv源码分析 djangorestframework框架之APIView源码分析
1 CBV的源码分析 #视图 class login (View): pass #路由 url(r'^books/$', views.login.as_view()) #阅读源码: #左侧工程栏--- ...