Webpack 笔记
本笔记内容来自一小时包教会 —— webpack 入门指南
安装和配置
1. 安装
使用 npm
的形式来安装
1
| $ npm install webpack -g
|
需要把依赖写入package.json
包,更人性化
1 2
| $ npm init $ npm install webpack --save-dev
|
2. 配置
每个项目下都必须配置有一个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
| var webpack = require('webpack'); var commonsPlugin = new webpack.optimize.CommonsChunkPlugin('common.js');
module.exports = { plugins: [commonsPlugin], entry: { index : './src/js/page/index.js' }, output: { path: 'dist/js/page', filename: '[name].js' }, module: { loaders: [ { test: /\.css$/, loader: 'style-loader!css-loader' }, { test: /\.js$/, loader: 'jsx-loader?harmony' }, { test: /\.scss$/, loader: 'style!css!sass?sourceMap'}, { test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'} ] }, resolve: { root: 'E:/github/flux-example/src', extensions: ['', '.js', '.json', '.scss'], alias: { AppStore : 'js/stores/AppStores.js', ActionType : 'js/actions/ActionType.js', AppAction : 'js/actions/AppAction.js' } } };
|
⑴ plugins
是插件项,这里我们使用了一个 CommonsChunkPlugin
的插件,它用于提取多个入口文件的公共脚本部分,然后生成一个common.js
来方便多页面之间进行复用。
⑵ entry
是页面入口文件配置,output
是对应输出项配置(即入口文件最终要生成什么名字的文件、存放到哪里),其语法大致为:
1 2 3 4 5 6 7 8 9 10 11
| { entry: { page1: "./page1", page2: ["./entry1", "./entry2"] }, output: { path: "dist/js/page", filename: "[name].bundle.js" } }
|
该段代码最终会生成一个 page1.bundle.js
和 page2.bundle.js
,并存放到 ./dist/js/page
文件夹下。
⑶ module.loaders
是最关键的一块配置。它告知 webpack
每一种文件都需要使用什么加载器来处理:
1 2 3 4 5 6 7 8 9 10 11 12 13
| module: { loaders: [ { test: /\.css$/, loader: 'style-loader!css-loader' }, { test: /\.js$/, loader: 'jsx-loader?harmony' }, { test: /\.scss$/, loader: 'style!css!sass?sourceMap'}, { test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'} ] }
|
"-loader"
其实是可以省略不写的,多个 loader
之间用 "!"
连接起来。
拿最后一个 url-loader
来说,它会将样式中引用到的图片转为模块来处理,使用该加载器需要先进行安装:
1 2 3 4 5
| npm install style-loader --save-dev npm install css-loader --save-dev npm install jsx-loader --save-dev npm install sass-loader --save-dev npm install url-loader --save-dev
|
检查是否安装成功可使用:npm style-loader -v
命令查看,或查看 package.json
文件。
配置信息的参数“?limit=8192”表示将所有小于8kb的图片都转为base64形式(其实应该说超过8kb的才使用 url-loader 来映射到文件,否则转为data url形式)。
⑷最后是 resolve
配置,这块很好理解,直接写注释了:
1 2 3 4 5 6 7 8 9 10 11 12
| resolve: { root: 'E:/github/flux-example/src', extensions: ['', '.js', '.json', '.scss'], alias: { AppStore : 'js/stores/AppStores.js', ActionType : 'js/actions/ActionType.js', AppAction : 'js/actions/AppAction.js' } }
|
运行 webpack
webpack 的执行也很简单,直接执行
1
| $ webpack --display-error-details
|
其他主要的参数有:
1 2 3 4 5 6 7
| $ webpack --config XXX.js
$ webpack --watch
**$ webpack -p
$ webpack -d
|
其中的 -p 是很重要的参数,曾经一个未压缩的 700kb 的文件,压缩后直接降到 180kb_(主要是样式这块一句就独占一行脚本,导致未压缩脚本变得很大)_。
模块引入
1. HTML
直接在页面引入 webpack 最终生成的页面脚本即可
1 2 3 4 5 6 7 8 9 10 11
| <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>demo</title> </head> <body> <script src="dist/js/page/common.js"></script> <script src="dist/js/page/index.js"></script> </body> </html>
|
2. JS
各脚本模块可以直接使用 commonJS
来书写,并可以直接引入未经编译的模块,比如 JSX、sass、coffee
等(只要你在 webpack.config.js
里配置好了对应的加载器)。
我们再看看编译前的页面入口文件(index.js):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| require('../../css/reset.scss'); require('../../css/allComponent.scss'); var React = require('react'); var AppWrap = require('../component/AppWrap'); var createRedux = require('redux').createRedux; var Provider = require('redux/react').Provider; var stores = require('AppStore');
var redux = createRedux(stores);
var App = React.createClass({ render: function() { return ( <Provider redux={redux}> {function() { return <AppWrap />; }} </Provider> ); } });
React.render( <App />, document.body );
|
其它这一章节请移步至一小时包教会 —— webpack 入门指南