引自官网:css
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序须要的每一个模块,而后将全部这些模块打包成一个或多个 bundle。html
目前最新的版本是v4.32.2,webpack4升级以后,增长了不少新特性webpack
webpack是个模块打包机,不管什么资源都会被打包成模块,模块之间是有引用关系的,因此会构建一个关系依赖图,那么咱们须要一个入口文件,从这个入口开始一步一步查找依赖关系,加载模块。es6
咱们须要在webpack.config.js
配置web
module.exports = {
entry: './path/to/my/entry/file.js'
};
复制代码
上面这个例子是一个单入口,也就是单页应用所使用的配置, 那么若是是多页应用,配置就须要改一下npm
module.exports = {
entry: {
index: './path/to/my/entry/list.js',
list: './path/to/my/entry/list.js'
}
};
复制代码
多入口,须要定义成Object对象,key以后还会被使用json
output
属性告诉webpack
在哪里输出它所建立的bundles
,以及如何命名这些文件,默认值为./dist
。bash
不管是单入口仍是多入口,只能指定一个outputbabel
filename
用于输出文件的文件名。path
的绝对路径。单入口的配置以下app
const config = {
output: {
filename: 'bundle.js',
path: '/home/proj/public/assets'
}
};
复制代码
多入口配置
{
entry: {
app: './src/app.js',
search: './src/search.js'
},
output: {
filename: '[name].js',
path: __dirname + '/dist'
}
}
复制代码
filename
应该使用占位符来确保每一个文件具备惟一的名称,占位符取值就是entry
里的key
mode
是webpack4新增的特性。 提供两个选择:
选项 | 描述 |
---|---|
development |
会将 process.env.NODE_ENV 的值设为 development 。启用 NamedChunksPlugin 和 NamedModulesPlugin 。 |
production |
会将 process.env.NODE_ENV 的值设为 production 。启用 FlagDependencyUsagePlugin , FlagIncludedChunksPlugin , ModuleConcatenationPlugin , NoEmitOnErrorsPlugin , OccurrenceOrderPlugin , SideEffectsFlagPlugin 和 UglifyJsPlugin 。 |
综合来讲就是会默认启用对当前环境设置的默认插件,方便开发或者有利于打包输出。 能够直接在webpack.config.js里配置,也能够在命令里直接添加参数
module.exports = {
mode: 'production'
};
复制代码
webpack --mode=production
复制代码
webpack
开箱即用的只有js
和json
两种文件类型,想要支持其余文件类型的源代码转换就须要loader
。好比es6
转换须要babel-loader
,css
转换须要css-loader
,typeScript
转换须要ts-loader
。
loader
自己是一个函数,接收源文件做为参数,返回转换的结果。
推荐配置,在webpack.config.js
文件中指定 loader
:
module: {
rules: [
{
test: /\.css$/,
use: [
{ loader: 'style-loader' },
{
loader: 'css-loader',
options: {
modules: true
}
}
]
}
]
}
复制代码
注意:多个loader的状况下,是按照从右到左的顺序执行,要注意书写顺序。
插件是 webpack
的支柱功能,是对webpack功能的加强。 能够作打包文件的优化压缩,资源的管理,环境变量注入等loader
没法实现的事情。
webpack 插件是一个具备 apply 属性的 JavaScript 对象。apply 属性会被 webpack compiler 调用,而且 compiler 对象可在整个编译生命周期访问。
换句话说,plugins
能够做用于整个构建过程。
因为插件能够携带参数/选项,你必须在 webpack 配置中,向 plugins 属性传入 new 实例。
webpack.config.js:
const HtmlWebpackPlugin = require('html-webpack-plugin'); //经过 npm 安装
const webpack = require('webpack'); //访问内置的插件
const path = require('path');
const config = {
entry: './path/to/my/entry/file.js',
output: {
filename: 'my-first-webpack.bundle.js',
path: path.resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
use: 'babel-loader'
}
]
},
plugins: [
new webpack.optimize.UglifyJsPlugin(),
new HtmlWebpackPlugin({template: './src/index.html'})
]
};
module.exports = config;
复制代码
webpack学习之路(五)loader初识及经常使用loader介绍
webpack学习之路(四)webpack-hot-middleware实现热更新
webpack学习之路(三)webpack-dev-middleware
webpack学习之路(二)webpack-dev-server实现热更新
I am moving forward.