WebPack 理解

一、什么是webpack:webpack是一款模块加载兼打包工具,它可以将js、jsx、coffee、样式sass、less,图片等作为模块来使用和处理。
二、优势:1、以commonJS的形式来书写脚本,对AMD、CMD的支持也很全面,方便旧项目的迁移。2、能被模块化的不止是JS了。3、能替代部分grunt/gulp的工作,例如打包,压缩混淆,图片转base64等。3、扩展性强,插件机制完善,支持React热拔插(react-hot-loader)
三、安装和配置:
1、安装:直接使用npm来进行安装
$ npm install webpack -g
将依赖写入package.json包
$ npm init
$ npm install webpack --save-dev
2、配置:
每个项目必须配置一个webpack.config.js,作用如同gulpfile.js/Gruntfile.js,一个配置项,告诉webpack要做什么。
示例:
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'
}
}
};
(1)plugins是插件项,这里使用了一个CommonsChunkPlugin的插件,它用于提取多个入口文件的公共脚本部分,然后生成一个common.js来方便多页面之间的复用。
(2)entry是页面的入口文件配置,output是对应的输出项配置
{
entry: {
page1: "./page1",
//支持数组形式,将加载数组中的所有模块,但以最后一个模块作为输出
page2: ["./entry1", "./entry2"]
},
output: {
path: "dist/js/page",
filename: "[name].bundle.js"
}
}
该代码会生成一个page1.bundle.js和page2.bundle.js,并存放在./dist/js/page文件夹下。
(3)module.loaders,告知webpack每一种文件都需要什么加载器来处理
module: {
//加载器配置
loaders: [
//.css 文件使用 style-loader 和 css-loader 来处理
{ test: /.css$/, loader: 'style-loader!css-loader' },
//.js 文件使用 jsx-loader 来编译处理
{ test: /.js$/, loader: 'jsx-loader?harmony' },
//.scss 文件使用 style-loader、css-loader 和 sass-loader 来编译处理
{ test: /.scss$/, loader: 'style!css!sass?sourceMap'},
//图片文件使用 url-loader 来处理,小于8kb的直接转为base64
{ test: /.(png|jpg)$/, loader: 'url-loader?limit=8192'}
]
}
-loader可以不写,多个loader之间用“!”连接起来。所有的加载器都需要通过npm来加载。
例如最后一个url-loader,它会将样式中引用到的图片转为模块来处理。使用前进行安装:
$ npm install url-loader -save-dev
配置信息的参数:“?limit=8192”表示将所有小于8kb的图片都转为base64形式(超过8kb的才使用url-loader来映射到文件,否则转为data url形式)
(4)resolve配置,
resolve: {
//查找module的话从这里开始查找
root: 'E:/github/flux-example/src', //绝对路径
//自动扩展文件后缀名,意味着我们require模块可以省略不写后缀名
extensions: ['', '.js', '.json', '.scss'],
//模块别名定义,方便后续直接引用别名,无须多写长长的地址
alias: {
AppStore : 'js/stores/AppStores.js',//后续直接 require('AppStore') 即可
ActionType : 'js/actions/ActionType.js',
AppAction : 'js/actions/AppAction.js'
}
}
四、运行webpack,直接执行:
$ webpack --display-error-details
后面的参数 “-display-error-details”推荐加上,方便出错时能了解到更详尽的信息。其他主要参数:
$ webpack --config XXX.js //使用另一份配置文件(比如webpack.config2.js)来打包
$ webpack --watch //监听变动并自动打包
$ webpack -p //压缩混淆脚本,这个非常非常重要!
$ webpack -d //生成map映射文件,告知哪些模块被最终打包到哪里了
-p是很重要的参数,曾经一个未压缩的 700kb 的文件,压缩后直接降到 180kb(主要是样式这块一句就独占一行脚本,导致未压缩脚本变得很大)。
五、模块引入:
1、在HTML页面引入:引入webpack最终生成的脚本即可:




demo






可以看到我们连样式都不用引入,毕竟脚本执行时会动态生成style并标签打到head里。
2、JS引入:各脚本模块可以使用common.js来书写,并可以直接引入未经编译的模块,比如:jsx,coffee,sass,只要在webpack.config.js中配置好了对应的加载器就行。
编译页面的入口文件:
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 (

{function() { return ; }}

);
}
});
React.render(
, document.body
);

其他:
1、shimming :
在 AMD/CMD 中,我们需要对不符合规范的模块(比如一些直接返回全局变量的插件)进行 shim 处理,这时候我们需要使用 exports-loader 来帮忙:
{ test: require.resolve(“./src/js/tool/swipe.js”), loader: “exports?swipe”}
之后在脚本中需要引用该模块的时候,这么简单地来使用就可以了:
require(‘./tool/swipe.js’);
swipe();
2、自定义公共模块提取:
在文章开始我们使用了 CommonsChunkPlugin 插件来提取多个页面之间的公共模块,并将该模块打包为 common.js 。
但有时候我们希望能更加个性化一些,我们可以这样配置:
var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin");
module.exports = {
entry: {
p1: "./page1",
p2: "./page2",
p3: "./page3",
ap1: "./admin/page1",
ap2: "./admin/page2"
},
output: {
filename: "[name].js"
},
plugins: [
new CommonsChunkPlugin("admin-commons.js", ["ap1", "ap2"]),
new CommonsChunkPlugin("commons.js", ["p1", "p2", "admin-commons.js"])
]
};
//

你可能感兴趣的:(WebPack 理解)