前端将大型项目分成一个个单独的模块,一般封装好的每个模块都会实现一个目的明确的完成的功能。如何处理这些模块以及模块之间的依赖,将这些模块打包在一起成为一个完整的应用,就是webpack的任务。webpack一般从entry文件开始,逐步的搜索项目的所有依赖,通过各种loader(比如css-loader、url-loader、babel-loader)以及各种插件(如commonChunksPlugin、extractTextPlugin、UglifyJsWebpackPlugin、HtmlWebpackPlugin、InlineManifestWebpackPlugin、DefinePlugin、hashedModulesPlugin、OptimizeCssAssetsPlugin)处理优化资源文件,最终打包出一个或者多个适合在浏览器中运行的js文件
基本知识
- entry
- output
- externals
- loaders
- plugins
- resolve
- configuration
- modules
- modules resolution
- targets
- manifest
- code split
- Caching
开发和发布环境配置
- 通用配置
- 公共插件
- webpack-merge
- HtmlWebpackPlugin
- DefinePlugin
- 公共插件
- 开发环境
- 使用source map
- 配置一个实现热更新的localhost的服务器
- 插件
- connect-history-api-fallback
- HotModuleReplacementPlugin
- friendly-errors-webpack-plugin
- 发布环境
- tree shaking
- source map
- Plugin
- ExtractTextPlugin
- DefinePlugin
- CommonsChunkPlugin
- inline-manifest-webpack-plugin
- HashedModuleIdsPlugin
- optimize-css-assets-webpack-plugin
- ModuleConcatenationPlugin
css loaders
基本知识
entry
entry: { [entryChunkName:string]: string | Array(string) }
,配置入口文件的地址,可以是string或者string组成的array
entry: {
pageOne: './src/pageOne/index.js',
pageTwo: './src/pageTwo/index.js',
pageThree: './src/pageThree/index.js'
}
output
output: {
filename: string // 打包输出的文件名
path: string // 打包输出文件的路径
chunkFilename: string // 代码分离时打包输出的块的名字
publicPath: string // 配置资源的CDN或者hash地址
}
externals
防止将某些 import 的包(package)打包到 bundle 中,而是在运行时(runtime)再去从外部获取这些扩展依赖(external dependencies)。
externals : {
jquery: 'jQuery'
}
import $ from 'jquery'
就会在运行时去获取通过 引入的jquery
externals : {
lodash : {
commonjs: "lodash",
amd: "lodash",
root: "_" // 指定全局变量
}
}
// or
externals : {
subtract : {
root: ["math", "subtract"] //转换为父子结构,其中 math 是父模块,而 bundle 只引用 subtract 变量下的子集。
}
}
通过window['math']['subtract']
访问subtract
loaders
loaders是模块源码的转换器。可以将一些其他类型的语言(如typescript)等转换为javascript,内联图片和一些其他的资源,loaders甚至允许你在js中import css资源
module: {
rules: [
{
test: /\.css$/,
use: [
{ loader: 'style-loader' },
{
loader: 'css-loader',
options: {
modules: true
}
}
]
}
]
}
在module.rules定义一些列loaders
- loaders可以被串联在一起。如
sass: 'vue-style-loader!css-loader?sourceMap!sass-loader?indentedSyntax&sourceMap'
- loaders可以是同步或者异步的
- loaders运行在Nodejs中,所以可以使用Nodejs的资源
- loaders可以接受query参数
- loaders也可以配置options参数
- 插件可以给loaders提供更多特性
使用方法
loader的options:: 修改文件名,放在输出目录下,并返其对应的 url
test: 检测哪些文件需要此loader,是一个正则表达式
exclude: 忽略哪些文件
file-loader
处理资源文件,寻找资源文件并将其放在输出目录里面,为了更好地缓存文件,可以使用版本hash为资源文件命名。
require("file?name=html-[hash:6].html!./page.html");
// => html-109fa8.html
资源路径规则:
- 相对URLs:如
./assets/logo.png
会解释成require('./assets/logo.png')
- 没有前缀URLs:如
assets/logo.png
会被当做相对路径./assets/logo.png
-
~
为前缀:如~assets/logo.png
解释成require('assets/logo.png')
- 绝对路径: 不会被处理
url-loader
如果图片大小小于一个limit,转化为base64,否则回退到file-loader的功能
html-loader
把Html文件输出成字符串。它默认处理html中的[图片上传失败...(image-58f768-1513065689939)]
为require("./image.png")
,同时需要在你的配置中指定image文件的加载器,比如:url-loader或者file-loader。
css-loader、postcss-loader、style-loader
postcss-loader:对css应用autoprefixer
css-loader:解决css文件中的路径问题,将css中资源作为依赖:如background: url(./logo.png)
,webpack以获取模块的方式来获取图片
style-loader:将css转化为js模块,注入