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", "es"],"env": {"development": {"plugins": [["react-transform", {"transforms": [{"transform": "react-transform-hmr","imports": ["react"],"locals": ["module"]}]}]]}}}
使用React时,可以热加载模块了。