本篇文章旨在让同窗们了解
Webpack
的基本概念和使用方法。讲解的也会浅显易懂。javascript
在前端模块化开发的今天,咱们在工做中常常会接触到一些编译构建工具,如Parcel
(极速零配置Web应用打包工具),Rollup
(新一代JavaScript模块打包器),Gulp
(基于流的自动化构建工具),Webpack
(JavaScript应用程序的静态模块打包工具)等等。这其中Webpack
是用户量最庞大的一个。咱们在开发Vue
或React
项目的时候都会接触到Webpack
的配置状况。因此学好这项技术对咱们的前端发展是有帮助的。css
本质上,Webpack
是一个现代JavaScript
应用程序的静态模块打包器(module bundler
)。当 Webpack
处理应用程序时,它会递归地构建一个依赖关系图(dependency graph
),其中包含应用程序须要的每一个模块,而后将全部这些模块打包成一个或多个bundle
。html
在开始学习以前,咱们先理解四个核心概念:前端
module.exports = {
entry:'./index',
// webpack打包入口文件
output: {
path: path.resolve(__dirname, "dist"), // string
// 全部输出文件的目标路径
filename: "[chunkhash].js", // string
// 输出的文件名称
publicPath: "/assets/", // string
// 构建文件的输出目录,可不输入。
},
module: {
rules: [
{
test: /\.js$/, // RegExp | string
loader: 'babel-loader', // 模块上下文解析
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')] // 和test同样,必须匹配选项
}
]
},
plugins: [
new HtmlWebpackPlugin({
filename: './dist/index.html', // 将HTML写入的文件。默认为index.html
template: 'index.html', // webpack模板的相对或绝对路径
inject: true, // true或'body'全部javascript资源都将放置在body元素的底部。'head'会将脚本放置在head元素中
minify: { // 控制是否以及以何种方式最小化输出
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// ...
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
})
]
}
复制代码
单入口写法:entry: string | Array<string>
java
module.exports = {
entry: './src/index.js'
}
复制代码
多入口写法:entry: {[entryChunkName]: string} | Array<string>
node
module.exports = {
entry: {
app: './src/app.js',
admin: './src/admin.js'
}
}
复制代码
配置output
选项能够控制webpack
如何向硬盘写入编译文件。注意,即便能够存在多个入口起点,但只指定一个输出配置。webpack
在webpack
中配置output
属性的最低要求是,将它的值设置为一个对象,包括如下两点:web
module.exports = {
output: {
filename: 'bundle.js',
path: __dirname + '/dist'
}
}
复制代码
若是是多入口,output 的写法可使用占位符(substitutions)
来确保每一个文件具备惟一的名称。npm
module.exports = {
entry: {
app: './src/app.js',
admin: './src/admin.js'
},
output: {
filename: '[name].js',
path: __dirname + '/dist'
}
}
复制代码
咱们先理解一下概念:loader
用于对模块的源代码进行转换。loader
可使你在import
或"加载"模块时预处理文件。所以loader
相似于其余构建工具中“任务(task)”,并提供了处理前端构建步骤的强大方法。loader
能够将文件从不一样的语言(如 TypeScript
)转换为JavaScript
,或将内联图像转换为 data URL
。loader
甚至容许你直接在JavaScript
模块中 import CSS
文件!bash
module.exports = {
entry: './src/index.js' ,
output: {
filename: '[name].js',
path: __dirname + '/dist'
},
module: {
rules: [
{
test: /.less$/, // 匹配使用此loader的文件
use: [ // 使用的loader名称
'style-loader',
'css-loader',
'less-loader'
]
},
{
test: /.(png|jpg|gif|jpeg)$/,
use: [
{
loader: 'url-loader',
options: {
limit: 10240
}
}
]
}
]
}
}
复制代码
经常使用的loaders包括:
名称 | 描述 |
---|---|
babel-loader | 转换ES5,ES6,ES7等JS新特性语法 |
style-loader | 将模块导出做为样式添加到DOM |
css-loader | 用解析后的导入加载CSS文件并返回CSS代码 |
less-loader | 将LESS文件编译为CSS文件 |
ts-loader | 将TS代码转换为JS代码 |
file-loader | 将文件打包进对应的目录,并返回相对的地址 |
url-loader | 相似file-loader,若是文件小于限制的大小,能够返回数据的DataURL |
插件用于打包文件的优化,资源管理和环境变量的注入。做用于整个构建过程。插件的目的在于解决loader
没法实现的其它事情
const HtmlWebpackPlugin = require('html-webpack-plugin'); //经过 npm 安装
const webpack = require('webpack'); //访问内置的插件
module.exports = {
entry: './src/index.js' ,
output: {
filename: '[name].js',
path: __dirname + '/dist'
},
module: {
rules: [
{
test: /\.(js|jsx)$/,
use: [
'babel-loader',
]
}
]
},
plugins: [
new webpack.optimize.UglifyJsPlugin(),
new HtmlWebpackPlugin({template: './src/index.html'})
]
}
复制代码
经常使用的plugins
包括:
名称 | 描述 |
---|---|
CommonsChunkPlugin | 将chunks相同的代码提取成公共js |
cleanWebpackPlugin | 清理构建的目录 |
HtmlWebpackPlugin | 建立html文件去承载你build后的js |
UglifyjsWebpackPlugin | 插件使用uglify-js来压缩代码 |
HotModuleReplacementPlugin | 启用热更新模块,也就是HMR |
DllPlugin | 为了极大减小构建时间,进行分离打包 |
ZipWebpackPlugin | 将打出的资源生成一个zip包 |
TerserPlugin |
mode
用来指定当前的构建环境是:production
,development
,或者是none
。 设置mode
可使⽤webpack
内置的函数,其默认值为production
。
选项 | 描述 |
---|---|
production | 设置process.env.NODE_ENV 的值为production ,启用FlagDependencyUsagePlugin ,FlagIncludedChunksPlugin ,ModuleConcatenationPlugin ,NoEmitOnErrorsPlugin ,OccurrenceOrderPlugin ,SideEffectsFlagPlugin 和TerserPlugin |
development | 设置process.env.NODE_ENV 的值为development ,启用NamedChunksPlugin 和NamedModulesPlugin |
none | 不开启任何优化选项 |
module.exports = {
... ,
devServer: {
contentBase: './dist',
hot: true
},
plugins: [
new webpack.HotModuleReplacementPlugin()
]
}
复制代码
这里介绍了Webpack
的入门实践。但愿能够帮助到你们理解相关的概念。最近看知乎看到一句话挺有意思的。分享一下,原话是:“计算机教会我不少原理,我却用它来更好的生活”。