安装webpack过程略过,同学可自行查看上一篇文章.
1.在项目目录下新建文件webpack.config.js
1 | module.exports = { |
这个一个符合CommonJS风格的module
2.简单的配置之后就可以运行打包。1
webpack
webpack就会读取配置文件webpack.config.js
,build并生成app.bundle.js
3.还可以依赖插件,通过loader加载不同格式的文件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
30const webpack = require('webpack');
module.exports = {
entry: './src/app.js',
output: {
path: './bin',
filename: 'app.bundle.js',
},
module: {
loaders: [{ //加载器
test: /\.jsx?$/,
exclude: /node_modules/,
loader: 'babel',
}]
},
resolve: {
extension: ['', '.js', '.css'],
alias: {//设置别名
jquery: ("jquery"),
qrcode: ("jquery.qrcode")
}
},
plugins: [
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery"
})
]
}
4.使用jQuery和jQuery插件
如上面的代码plugins:1
2
3
4
5
6
7lugins: [ //全局变量不用require
new webpack.ProvidePlugin({
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery"
})
]
对于不支持CommonJS规范的模块,需要安装 imports-loader
1 | //app.js |
config文件说明
entry
配置要打包的文件的入口;可以配置多个入口文件,下面会有介绍。
resolve
配置文件后缀名(extensions),除了js,还有jsx、coffee等等。
alias配置项,可以为常用模块配置改属性,可以节省编译的搜索时间。例如:1
2
3
4
5
6resolve:{
extensions:['.js','.jsx'],
alias:{
'react':path.join(nodeModulesPath,'react/react.js')
}
}
output
配置输出文件的路径,文件名等。
module(loaders)
配置要使用的loader。对文件进行一些相应的处理。比如babel-loader可以把es6的文件转换成es5。
大部分的对文件的处理的功能都是通过loader实现的。loader就相当于gulp里的task。loader可以用来处理在入口文件中require的和其他方式引用进来的文件。loader一般是一个独立的node模块,要单独安装。
loader配置项:1
2
3
4test: /\.(js|jsx)$/, //注意是正则表达式,不要加引号,匹配要处理的文件
loader: 'eslint-loader', //要使用的loader,"-loader"可以省略
include: [path.resolve(__dirname, "src/app")], //把要处理的目录包括进来
exclude: [nodeModulesPath] //排除不处理的目录
目前已有的loader列表:https://webpack.github.io/docs/list-of-loaders.html
一个module的例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17module: {
preLoaders: [
{
test: /\.(js|jsx)$/,
loader: 'eslint-loader',
include: [path.resolve(__dirname, "src/app")],
exclude: [nodeModulesPath]
},
],
loaders: [
{
test: /\.(js|jsx)$/, //正则表达式匹配 .js 和 .jsx 文件
loader: 'babel-loader?optional=runtime&stage=0',//对匹配的文件进行处理的loader
exclude: [nodeModulesPath]//排除node module中的文件
}
]
}
plugins
顾名思义,就是配置要使用的插件。plugin是比loader功能更强大的插件,能使用更多的wepack api。来看一个使用plugin的例子:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15plugins: [
//压缩打包的文件
new webpack.optimize.UglifyJsPlugin({
compress: {
//supresses warnings, usually from module minification
warnings: false
}
}),
//允许错误不打断程序
new webpack.NoErrorsPlugin(),
//把指定文件夹xia的文件复制到指定的目录
new TransferWebpackPlugin([
{from: 'www'}
], path.resolve(__dirname,"src"))
]
目前已有的plugins列表:http://webpack.github.io/docs/list-of-plugins.html
可以暴露成全局变量的2个配置 ,引用国际友人的解释。来源
externals
ProvidePlugin
It’s both possible: You can include libraries with a <script>
(i. e. to use a library from a CDN) or include them into the generated bundle.
If you load it via <script>
tag, you can use the externals option to allow to write require(…) in your modules.
Example with library from CDN:1
2
3
4
5
6
7<script src="https://code.jquery.com/jquery-git2.min.js"></script>
// the artifial module "jquery" exports the global var "jQuery"
externals: { jquery: "jQuery" }
// inside any module
var $ = require("jquery");
Example with library included in bundle:1
2
3
4
5
6
7
8copy `jquery-git2.min.js` to your local filesystem
// make "jquery" resolve to your local copy of the library
// i. e. through the resolve.alias option
resolve: { alias: { jquery: "/path/to/jquery-git2.min.js" } }
// inside any module
var $ = require("jquery");
The ProvidePlugin
can map modules to (free) variables. So you could define: “Every time I use the (free) variable xyz inside a module you (webpack) should set xyz
to require("abc")
.”
Example without ProvidePlugin
:1
2
3// You need to require underscore before you can use it
var _ = require("underscore");
_.size(...);
Example with ProvidePlugin:1
2
3
4
5
6
7
8plugins: [
new webpack.ProvidePlugin({
"_": "underscore"
})
]
// If you use "_", underscore is automatically required
_.size(...)
Summary:
Library from CDN: Use <script>
tag and externals
option
Library from filesystem: Include the library in the bundle. (Maybe modify resolve options to find the library)externals
: Make global vars available as moduleProvidePlugin
: Make modules available as free variables inside modules