前言 真快呀,过年的时候才对webpack 1的了点感性认识,就做了两个关于Vue的项目,之后就出了webpack 2,怕来不及记录,所以写这篇文章来记录一下Webpack 2。
webpack is a module bundler for modern JavaScript applications.
上述是来自官方文档的定义,说白了就是webpack = module bundler(加载器) ,对于webpack来说,所有的文件都是模块,只是处理的方式不一样罢了。
说道学习webpack的难易程度:
It is incredibly configurable, but to get started you only need to understand Four Core Concepts: entry, output, loaders, and plugins. 官网说:「很容易的,只要理解了entry、output、loaders、plugins这四个核心概念,你就入门了!」
所以要好好学英语呀,当然还有一些cli/nodeJS的知识。
webpack配置文件 要想使用webpack,其根目录下会有一个webpack.config.js 的文件,大概是这样:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
var webpack = require ("webpack" );
var DefinePlugin = require ('webpack/lib/DefinePlugin' );
module .exports = {
context :process.cwd(),
watch : true ,
entry : './index.js' ,
devtool : 'source-map' ,
output : {
path : path.resolve(process.cwd(),'dist/' ),
filename : '[name].js'
},
resolve : {
alias :{ jquery : process.cwd()+'/src/lib/jquery.js' , }
},
plugins : [
new webpack.ProvidePlugin({
$ : 'jquery' ,
_ : 'underscore' ,
React : 'react'
}),
new DefinePlugin({
'process.env' : {
'NODE_ENV' : JSON .stringify('development' )
}
})
],
module : {
loaders : [{
test : /\.js[x]?$/ ,
exclude : /node_modules/ ,
loader : 'babel-loader'
}, {
test : /\.less$/ ,
loaders :['style-loader' , 'css-loader' ,'less-loader' ]
}, {
test : /\.(png|jpg|gif|woff|woff2|ttf|eot|svg|swf)$/ ,
loader : "file-loader?name=[name]_[sha512:hash:base64:7].[ext]"
}, {
test : /\.html/ ,
loader : "html-loader?" + JSON .stringify({minimize : false })
} ]
}
};
这个简单的webpack配置文件,基本可以处理大多数的前端业务场景了。
解读webpack配置文件 讲解内容还是以一个Github项目为主:地址
四个核心概念 1. entry entry 就是整个模块的读取入口,根据webpack 2的文档,对entry 值有了更多的拓展1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
let base ='./index.js'
module .exports = {
entry :base,
output : {
filename : '_[name].js'
}
};
2. output output 这个对象的设置告诉webpack怎样的放置导出的文件。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const path =require ('path' );
let base = {
index :'./index.js' ,
index1 :'./index1.js'
};
module .exports = {
entry :base,
output : {
path: path.resolve(__dirname, 'dist' ),
publicPath: "/output/dist/" ,
libraryTarget:'umd' ,
library: "MyLibrary" ,
chunkFilename:'[chunkhash]_[name].js' ,
hashDigestLength:3 ,
filename: '[hash]_[name].js'
}
};
3. modules/loaders 对每一个不同文件的处理方式的设定1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
module : {
loaders : [{
test : /\.js[x]?$/ ,
exclude : /node_modules/ ,
loader : 'babel-loader'
}]
}
module :{
rules :[
{
test: /\.jsx?$/ ,
use:[{
loader : "babel-loader" ,
}]
},
]
}
4. plugins plugin是Webpack构建过程中的个性化的处理设置。其中有一些自带的插件。参考文档 1
2
3
4
5
6
7
8
plugins: [
new webpack.optimize.UglifyJsPlugin({
compress : {
warnings : false
}
})
]
这一部分,不知如何讲好,找了一些文档来辅助,辅助文档
以上是核心的四个概念和部分常用配置参数的讲解。
5. resolve
These options change how modules are resolved.resolve.alias 的作用就是对module模块提供别名,和require里的path参数有相似的作用。(可以将一些需要多次引用的模块改成一些东西)1
2
3
4
5
resolve:{
alias :{
jquery :path.resolve(__dirname,'/src/lib/jquery.js' )
}
}
这个是大招了,可以让我们在浏览器的调试工具调试的是否是源码。 如果想要显示源码,就用devtool:source-map
1
2
3
4
5
6
7
8
9
10
11
module .exports = {
devtool:'source-map' ,
target:"web" ,
entry :"./index.js" ,
output : {
path : path.resolve(__dirname, 'dist' ),
filename : '[name].js'
},
};