webpack 是什么
webpack
是近期最火的一款模块加载器兼打包工具,它能把各种资源,例如JS
(含JSX
)、coffee
、样式(含less
/sass
)、图片等都作为模块来使用和处理。
可以直接使用 require(XXX)
的形式来引入各模块,即使它们可能需要经过编译(比如JSX
和sass
)
webpack 的优势
- webpack 是以
commonJS
的形式来书写脚本滴,但对 AMD
/CMD
的支持也很全面,方便旧项目进行代码迁移。
- 能被模块化的不仅仅是 JS 了。
- 开发便捷,能替代部分
grunt
/gulp
的工作,比如打包、压缩混淆、图片转 base64 等。
- 扩展性强,插件机制完善,特别是支持 React 热插拔(见
react-hot-loader
)。
安装和配置
创建一个文件夹,安装webpack
依赖
$ npm init
$ npm install webpack --save-dev
配置 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 是插件项
- 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" } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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 之间用“!”连接起来。
- 所有的加载器都需要通过 npm 来加载
- 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 的运行
模块引入
直接在页面中引入打包好的脚本,样式不用引入,脚本执行时会动态生成<style>
并标签打到head
里。
入口 entryjs:
1 2 3 4
| require('./style.css') document.write('It works.') document.write(require('./module.js'))
|
其他被引入文件:
1 2 3 4 5 6 7
| module.exports = 'It works from module.js.'
body { background: #f9f9f9; }
|
编译
直接运行 webpack 即可编译文件。
\$ webpack –display-error-details
后面的参数--display-error-details
是推荐加上的,方便出错时能查阅更详尽的信息。亦可省略。
其他部分参数:
$ webpack --config XXX.js //使用另一份配置文件(比如webpack.config2.js)来打包
$ webpack --watch //监听变动并自动打包
$ webpack -p //压缩混淆脚本,这个非常非常重要!
$ webpack -d //生成map映射文件,告知哪些模块被最终打包到哪里了
开发环境
当项目逐渐变大,webpack 的编译时间会变长,可以通过参数让编译的输出内容带有进度和颜色。
$ webpack –progress –colors
如果不想每次修改模块后都重新编译,那么可以启动监听模式。开启监听模式后,没有变化的模块会在编译后缓存到内存中,而不会每次都被重新编译,所以监听模式的整体速度是很快的。
$ webpack –progress –colors –watch
使用 webpack-dev-server 开发服务是一个更好的选择。它将在 localhost:8080 启动一个 express 静态资源 web 服务器,并且会以监听模式自动运行 webpack,在浏览器打开 http://localhost:8080/ 或 http://localhost:8080/webpack-dev-server/ 可以浏览项目中的页面和编译后的资源输出,并且通过一个 socket.io 服务实时监听它们的变化并自动刷新页面。 # 安装
$ npm install webpack-dev-server -g
# 运行
$ webpack-dev-server --progress --colors
其他技巧
自定义公共模块提取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| 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']) ] }
|
独立打包样式文件
当项目的样式能不要被打包到脚本中,而是独立出来作为 css 时,这时候我们需要 extract-text-webpack-plugin
来帮忙.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| var webpack = require('webpack') var ExtractTextPlugin = require('extract-text-webpack-plugin')
module.exports = { plugins: [new ExtractTextPlugin('[name].css')], entry: './entry.js', output: { path: 'dist/', filename: '[name].js' }, module: { loaders: [ { test: /\.css$/, loader: 'style!css' }, { test: /\.less$/, loader: ExtractTextPlugin.extract( 'style-loader', 'css-loader!less-loader' ) } ] } }
|
转载自http://www.w2bc.com/Article/50764