webpack踩坑之路——構建基本的React+ES6項目

webpack是最近比較火的構建工具,搭配上一樣比較火的ReacJS與ES6(ES2015)必定是如今不少潮流 programmer 的追求。 廢話很少,下面就就看下如何從0搭起咱們的構建工具。css

 

安裝html

全局安裝webpack,若是安裝後仍是提示沒有webpack commond,能夠嘗試經過超級管理員身份安裝。node

$ npm install webpack -g
$ sudo npm install webpack -g 

或者在項目裏進行安裝react

$ npm install webpack --save-dev

 

配置webpack

建立目錄git

index.js文件內容:github

document.write('Hello Webpack');

生成package.json文件,-y爲生成默認內容web

$ npm init
$ npm init -y 

建立webpack.config.js文件npm

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)時的路徑。json

在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

 

感謝你的瀏覽,但願能爲你帶來幫助。

相關文章
相關標籤/搜索