1、webpack的配置文件webpack.config.js
//const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode:'none',
entry: './src/index.js',
output: {
path: __dirname + '/dist',
filename: 'dist.js'
},
}
上面代码是一个最最基本的webpac配置文件,
entry是指定要打包的入口文件,(多页面可以有多个入口)
output指定打包之后文件的路径和文件名(只有一个出口)
(其中几个目录请手动新建:src是放我们源码的文件夹,dist是放我们编译后文件的文件夹。)
有了基本的webpack.config.js,我们用webpack来打包就简单了,可以直接执行下面命令:
webpack
webpack默认就会去寻找根目录下的webpack.config.js文件。
打包成功,dist/js文件夹下就会生成一个dist.js。
2、我们也可以指定webpack的配置文件名
webpack.config.js是webpack默认的配置文件名,如果我们有一个webpack.dev.config.js配置,又如何让webpack来读取它呢?
只需要在执行打包命令的时候,加一个参数: --config `文件名
webpack --config `webpack.dev.config.js
3、webpack配合npm
还记得我们在npm init初始化之后,生成了一个package.json文件么?我们现在终于要用到它了。
我们在package.json文件中,增加一个scripts:
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"webpack": "webpack --config webpack.config.js"
},
上面我们增加了一个webpack项,我们可以看出其值其实也是执行的webpack命令。
既然我们是要webpack和npm配合,那么上面的配置到底有什么作用呢?
我们可以通过npm来调用webpack来,执行下面命令,同样完成webpack打包操作:
npm run webpack
npm run xxxx,其中 xxxx 就是我们上面配增加的scripts命令。
4、webpack配置的entry
entry是webpack打包的入口指示。
//entry:'路径',
entry:'./src/script/main.js',
它有三种形式:
1)、最简单的就是一个string,也是只有一个入口文件。我们前面已经见识了。
entry:'./src/script/main.js',
这种形式,你的所有的依赖,都在这个文件main.js中引入进来。
2)、数组的形式
entry:['./entry1','./entry2']
3)、对象的形式
entry: {
page1:'./page1',
page2:['./entry1','./entry2']
}
上面 数组的形式和对象形式,都2个入口。
5、webpack配置的output
然后我们把webpack.config.js中output段修改如下:
output:{
path:'./dist/js',
filename:'[name]-[hash].js' //这样我们打包之后的文件就是**main-本次打包的hash值.js**。
}
这样我们打包之后的文件就是 main-本次打包的hash值.js。
还可以:
filename:'[name]-[chunkhash].js'
这其中的hash值,我们可以认为是版本号,也就是说,只有在我们的文件改变了的时候,这个hash值才会有变化。最后打包的文件名就是随机的。
6、webpack配置的plugins
使用插件的方法:配置plugins:
1、要使用某个插件,需要通过npm安装它,然后在webpack.config.js中的plugins关键字部分添加该插件的一个实例(plugins是一个数组,new一个插件即可)。
如添加一个实现版权声明的插件:
module.exports = {
mode: 'none',
entry: __dirname + "/app/main.js",
output: {...},
module: {
loaders: [
{ test: /\.json$/, loader: "json" },
{ test: /\.js$/, exclude: /node_modules/, loader: 'babel' },
{ test: /\.css$/, loader: 'style!css?modules!postcss' }//这里添加PostCSS
]
},
postcss: [
require('autoprefixer')
],
//添加该插件的一个实例
plugins: [
new webpack.BannerPlugin("Copyright Flying Unicorns inc.")
],
devServer: {...}
}
2、几个常用的插件
1) HtmlWebpackPlugin
这个插件的作用是依据一个简单的模板,帮助生成最终的Html5文件,这个文件中自动引用了打包后的JS文件。每次编译都在文件名中插入一个不同的哈希值。
安装命令:npm install --save-dev html-webpack-plugin
这个插件自动完成了之前手动做的一些事情,在正式使用之前需要对项目结构做一些改变:
① 移除public文件夹,利用此插件,HTML5文件会自动生成,此外CSS已经通过前面的操作打包到JS中了。
② 在app目录下,创建一个HTML文件模板index.tmpl.html,这个模板包含title等其它需要的元素,在编译过程中,本插件会依据此模板生成最终的HTML页面,会自动添加所依赖的 css, js,favicon等文件,模板源代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body>
<div id='root'></div>
</body>
</html>
③ 更新webpack的配置文件,方法同上,新建一个build文件夹用来存放最终的输出文件。
var webpack = require('webpack');var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
devtool: 'eval-source-map',
entry: __dirname + "/app/main.js",
output: {
path: __dirname + "/build",
filename: "bundle.js"
},
module: {
loaders: [
{ test: /\.json$/, loader: "json" },
{ test: /\.js$/, exclude: /node_modules/, loader: 'babel' },
{ test: /\.css$/, loader: 'style!css?modules!postcss' }
]
},
postcss: [
require('autoprefixer')
],
plugins: [
new HtmlWebpackPlugin({
template: __dirname + "/app/index.tmpl.html"//new 一个这个插件的实例,并传入相关的参数
})
],
devServer: {
colors: true,
historyApiFallback: true,
inline: true
}
}
2) Hot Module Replacement
Hot Module Replacement(HMR)也是webpack里很有用的一个插件,它允许在修改组件代码后,自动刷新实时预览修改后的效果。
在webpack中实现HMR也很简单,只需要做两项配置
① 在webpack配置文件中添加HMR插件;
② 在Webpack Dev Server中添加“hot”参数。
不过配置完这些后,JS模块其实还是不能自动热加载的,还需要在JS模块中执行一个Webpack提供的API才能实现热加载,虽然这个API不难使用,但是如果是React模块,使用已经熟悉的Babel可以更方便的实现功能热加载。
具体实现方法如下:
① Babel和webpack是独立的工具;
② 二者可以一起工作;
③ 二者都可以通过插件拓展功能;
④ HMR是一个webpack插件,它让你能浏览器中实时观察模块修改后的效果,但是如果你想让它工作,需要对模块进行额外的配额;
⑤ Babel有一个叫做react-transform-hrm的插件,可以在不对React模块进行额外的配置的前提下让HMR正常工作。
var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
devtool: 'eval-source-map',
entry: __dirname + "/app/main.js",
output: {
path: __dirname + "/build",
filename: "bundle.js"
},
module: {
loaders: [
{ test: /\.json$/, loader: "json" },
{ test: /\.js$/, exclude: /node_modules/, loader: 'babel' },
{ test: /\.css$/, loader: 'style!css?modules!postcss' }
]
},
postcss: [
require('autoprefixer')
],
plugins: [
new HtmlWebpackPlugin({
template: __dirname + "/app/index.tmpl.html"
}),
new webpack.HotModuleReplacementPlugin()//热加载插件
],
devServer: {
colors: true,
historyApiFallback: true,
inline: true,
hot: true
}
}
安装react-transform-hmr:npm install --save-dev babel-plugin-react-transform react-transform-hmr
配置Babel :
{
"presets": ["react", "es2015"],
"env": {
"development": {
"plugins": [["react-transform", {
"transforms": [{
"transform": "react-transform-hmr",
"imports": ["react"],
"locals": ["module"]
}]
}]]
}
}
}
使用React时,可以热加载模块了。