webpack是最近比較火的構建工具,搭配上同樣比較火的ReacJS與ES6(ES2015)一定是現在很多潮流 programmer 的追求。 廢話不多,下面就就看下如何從0搭起我們的構建工具。
安裝
全局安裝webpack,如果安裝后還是提示沒有webpack commond,可以嘗試通過超級管理員身份安裝。
$ npm install webpack -g
$ sudo npm install webpack -g
或者在項目里進行安裝
$ npm install webpack --save-dev
配置
創建目錄
index.js文件內容:
document.write('Hello Webpack');
生成package.json文件,-y為生成默認內容
$ npm init
$ npm init -y
創建webpack.config.js文件
var webpack = require('webpack'); module.exports = { entry: './app/index.js', //入口 output: { //輸出 path: 'bundle', publicPath: '/static/', filename: 'bundle.js' }, module: { loaders: [ //加載器 {test: /\.css$/, loader: 'style-loader!css-loader' }, {test: /\.js$/, loader: 'babel-loader'}, {test: /\.(png|jpg)$/, loader: 'url-loader?limit=8192'} ] } }
注意輸出中有一個path屬性和一個publicPath屬性,這二者的區別在於path為本地路徑,publicPath是你啟用服務器(webpack-dev-server/react-hot-loader)時的路徑。
在webpack中所以的資源都需要通過加載器加載,多個加載器之間用 ! 隔開,其中-loader的后綴是可以省略的。
webpack.config文件中每個申明的加載器都需要安裝,否則運行會報錯:
$ npm install style-loader css-loader --save-dev
鑒於一個項目中會有N多個loader,通常將這些loader寫入package.json文件的devDependencies屬性中,之后通過 $ npm install 命令一次全部安裝。
這里選用 babel 加載器來加載我們的JS文件,使用它最少需要安裝 babel-core 與 babel-loader。如果想用 babel 解析 ES6 和 React,還需要安裝上圖中的 babel-preset-es2015 和 babel-preset-react,這個后面再說。
運行
上述配置工作完成后我們來啟動webpack
$ webpack
執行該命令后,項目下多了個 bundle 文件夾,里面有輸出的 bundle.js 文件
在index.html中引入編譯過的bundle.js
<script src="../bundle/bundle.js"></script>
運行index.html文件
這樣就完成了基本配置並跑起了第一個DEMO,看下其他比較實用的命令
$ webpack --config xxx.js //使用另一份config文件 $ webpack --watch //自動監聽打包 $ webpack -p //壓縮混淆腳本 $ webpack -d //生成map映射文件
初上手第二個和第三個命令比較常用,--watch 使得我們不用每更改一次代碼就執行一次 $ webpack。-p會壓縮打包文件,使得體積減小很多,通常將壓縮后的文件發布到線上。
webpack中,所有資源都是通過模塊化的方式引入的。其同時支持commonjs和AMD的語法。接下來我們引入css文件。同時別忘記安裝 style-loader 與 css-loader。
style.css 內容
body { color: red; }
index.js 內容
require('./style.css');
document.write('Hello Webpack');
結果
支持ES6
上文說過要支持ES6,還需要安裝babel-preset-2015。
$ npm install babel-preset-es2015
安裝好之后修改webpack.config文件如下:
{ test: /\.js$/, loader: 'babel-loader', query: { presets: ['es2015'] } }
這里我們通過在app目錄下創建 app.js 文件:
let a = 'ES6 is working!'; export default a;
修改 index.js
import './style.css'; import text from './app.js'; alert(text); document.write('Hello Webpack');
結果
支持ReactJS
首先安裝 react 與 babel-preset-react
$ npm install react react-dom babel-preset-react --save-dev
修改 webpack.config,在preset屬性中添加react一項。
{ test: /\.js$/, loader: 'babel-loader', query: { presets: ['es2015', 'react'] } }
修改 app.js 內容
import React, { Component } from 'react'; class App extends Component { render() { return ( <h1>React is working!</h1> ); } } export default App;
修改 index.js 內容
import './style.css'; import React from 'react'; import ReactDOM from 'react-dom'; import Title from './app.js'; ReactDOM.render(<Title />, document.body);
結果
這樣我們就可以在靜態項目里同時使用ES6與React了,下面我們看看如果通過本地服務器實現瀏覽器自動刷新。
如果你項目中並沒有用到React,你可以通過webpack-dev-server來實現自動刷新。如果使用了React,可以使用量身定做的React-hot-loader。
下面來依次說說二者。
webpack-dev-server
安裝
npm install webpack-dev-server --save-dev
更改 index.html文件
<script src="static/bundle.js"></script>
此時的路徑就是 webpack.config 文件中 publickPath 中設置的
運行
webpack-dev-server
webpack-dev-server --port 3000
服務默認啟動8080端口,通過--port命令可以更改端口。這樣我們就可以在localhost:3000/index.html訪問到我們的頁面了。
熱刷新
webpack的熱刷新分為iframe模式與inline模式
iframe模式操作要簡單許多,其並不需要更改配置,只需要訪問localhost:3000/webpack-dev-server/index.html。
現在當我們更改 js 文件時瀏覽器就會自動刷新。
inline模式有興趣可以去參考文檔。
react-hot-loader
安裝
npm install react-hot-loader --save-dev
更改 webpack.config 文件,並引入插件。
entry: [ 'webpack-dev-server/client?http://localhost:2000', 'webpack/hot/only-dev-server', './js/index.js' ], plugins: [ new webpack.HotModuleReplacementPlugin() ], module: { loaders: [{ test: /\.js$/, loaders: ['babel', 'react-hot'], }] }
創建 server.js 文件
var webpack = require('webpack'), WebpackDevServer = require('webpack-dev-server'), config = require('./webpack.config'); new WebpackDevServer(webpack(config), { publicPath: config.output.publicPath, hot: true, historyApiFallback: true }).listen(3000, 'localhost', function (err, result) { if (err) { return console.log(err); } console.log('Listening at http://localhost:3000/'); });
使用命令啟動
node server.js
也可以寫入 package.json 中
"scripts": { "start": "node server.js" }
運行
npm start
這樣React項目就可以實現熱刷新了,不過在實際使用過程中還是會遇到各種坑。這里引入個完整的官方DEMO,親測可用,文檔也非常簡潔明了。
https://github.com/gaearon/react-hot-boilerplate
感謝你的瀏覽,希望能為你帶來幫助。