實戰webpack系列03

03.Webpack的強大功能

1、生成Source Maps(使調試更容易)

經過簡單的配置,webpack就能夠在打包時爲咱們生成的source maps,這爲咱們提供了一種對應編譯文件和源文件的方法,使得編譯後的代碼可讀性更高,也更容易調試。css

須要配置devtool,它有如下四種不一樣的配置選項,各具優缺點,描述以下:html

devtool選項 配置結果
source-map 在一個單獨的文件中產生一個完整且功能徹底的文件。這個文件具備最好的source map,可是它會減慢打包速度;
cheap-module-source-map 在一個單獨的文件中生成一個不帶列映射的map,不帶列映射提升了打包速度,可是也使得瀏覽器開發者工具只能對應到具體的行,不能對應到具體的列(符號),會對調試形成不便;
eval-source-map 使用eval打包源文件模塊,在同一個文件中生成乾淨的完整的source map。這個選項能夠在不影響構建速度的前提下生成完整的sourcemap,可是對打包後輸出的JS文件的執行具備性能和安全的隱患。在開發階段這是一個很是好的選項,在生產階段則必定不要啓用這個選項;
cheap-module-eval-source-map 這是在打包文件時最快的生成source map的方法,生成的Source Map 會和打包後的JavaScript文件同行顯示,沒有列映射,和eval-source-map選項具備類似的缺點;

正如上表所述,上述選項由上到下打包速度愈來愈快,不過同時也具備愈來愈多的負面做用,較快的打包速度的後果就是對打包後的文件的的執行有必定影響。node

對小到中型的項目中,eval-source-map是一個很好的選項,再次強調你只應該開發階段使用它,咱們繼續對上文新建的webpack.config.js,進行以下配置:react

module.exports = {
  devtool: 'eval-source-map',
  entry:  __dirname + "/app/main.js",
  output: {
    path: __dirname + "/public",
    filename: "bundle.js"
  }
}

cheap-module-eval-source-map方法構建速度更快,可是不利於調試,推薦在大型項目考慮時間成本時使用。webpack

2、使用webpack構建本地服務器

瀏覽器監聽你的代碼的修改,在webpack中進行配置以前須要單獨安裝它做爲項目依賴es6

npm install --save-dev webpack-dev-server

devserver做爲webpack配置選項中的一項,如下是它的一些配置選項,更多配置可參考web

devserver的配置選項 功能描述
contentBase 默認webpack-dev-server會爲根文件夾提供本地服務器,若是想爲另一個目錄下的文件提供本地服務器,應該在這裏設置其所在目錄(本例設置到「public"目錄
port 設置默認監聽端口,若是省略,默認爲」8080「
inline 設置爲true,當源文件改變時會自動刷新頁面
historyApiFallback 在開發單頁應用時很是有用,它依賴於HTML5 history API,若是設置爲true,全部的跳轉將指向index.html

把這些命令加到webpack的配置文件中,如今的配置文件webpack.config.js以下所示正則表達式

module.exports = {
  devtool: 'eval-source-map',

  entry:  __dirname + "/app/main.js",
  output: {
    path: __dirname + "/public",
    filename: "bundle.js"
  },

  devServer: {
    contentBase: "./public",//本地服務器所加載的頁面所在的目錄
    historyApiFallback: true,//不跳轉
    inline: true//實時刷新
  } 
}

在package.json中的scripts對象中添加以下命令,用以開啓本地服務器:npm

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack",
    "server": "webpack-dev-server --open"
  },

在終端中輸入npm run server便可在本地的8080端口查看結果
開啓本地服務器json

3、Loaders

Loaders是webpack提供的最激動人心的功能之一了。經過使用不一樣的loader,webpack有能力調用外部的腳本或工具,實現對不一樣格式的文件的處理,好比說分析轉換scss爲css,或者把下一代的JS文件(ES6,ES7)轉換爲現代瀏覽器兼容的JS文件,對React的開發而言,合適的Loaders能夠把React的中用到的JSX文件轉換爲JS文件。

Loaders須要單獨安裝而且須要在webpack.config.js中的modules關鍵字下進行配置,

Loaders的配置包括如下幾方面:

  • test:一個用以匹配loaders所處理文件的拓展名的正則表達式(必須)
  • loader:loader的名稱(必須)
  • include/exclude:手動添加必須處理的文件(文件夾)或屏蔽不須要處理的文件(文件夾)(可選);

不過在配置loader以前,咱們把Greeter.js裏的問候消息放在一個單獨的JSON文件裏,並經過合適的配置使Greeter.js能夠讀取該JSON文件的值,各文件修改後的代碼以下:

在app文件夾中建立帶有問候信息的JSON文件(命名爲config.json)

{
  "greetText": "Hi there and greetings from JSON!"
}

更新後的Greeter.js

var config = require('./config.json');

module.exports = function() {
  var greet = document.createElement('div');
  greet.textContent = config.greetText;
  return greet;
};

注 因爲webpack3./webpack2.已經內置可處理JSON文件,這裏咱們無需再添加webpack1.*須要的json-loader。在看如何具體使用loader以前咱們先看看Babel是什麼?

4、Babel

Babel實際上是一個編譯JavaScript的平臺,它能夠編譯代碼幫你達到如下目的:

  • 讓你能使用最新的JavaScript代碼(ES6,ES7...),而不用管新標準是否被當前使用的瀏覽器徹底支持;
  • 讓你能使用基於JavaScript進行了拓展的語言,好比React的JSX;
4.1. Babel的安裝與配置

Babel實際上是幾個模塊化的包,其核心功能位於稱爲babel-core的npm包中,webpack能夠把其不一樣的包整合在一塊兒使用,對於每個你須要的功能或拓展,你都須要安裝單獨的包(用得最多的是解析Es6的babel-env-preset包和解析JSX的babel-preset-react包)。

咱們先來一次性安裝這些依賴包

// npm一次性安裝多個依賴模塊,模塊之間用空格隔開
npm install --save-dev babel-core babel-loader babel-preset-env babel-preset-react

在webpack中配置Babel的方法以下:

module.exports = {
    entry: __dirname + "/app/main.js",//已屢次說起的惟一入口文件
    output: {
        path: __dirname + "/public",//打包後的文件存放的地方
        filename: "bundle.js"//打包後輸出文件的文件名
    },
    devtool: 'eval-source-map',
    devServer: {
        contentBase: "./public",//本地服務器所加載的頁面所在的目錄
        historyApiFallback: true,//不跳轉
        inline: true//實時刷新
    },
    module: {
        rules: [
            {
                test: /(\.jsx|\.js)$/,
                use: {
                    loader: "babel-loader",
                    options: {
                        presets: [
                            "env", "react"
                        ]
                    }
                },
                exclude: /node_modules/
            }
        ]
    }
};

如今你的webpack的配置已經容許你使用ES6以及JSX的語法了。繼續用上面的例子進行測試,不過此次咱們會使用React,記得先安裝 React 和 React-DOM

npm install --save react react-dom

接下來咱們使用ES6的語法,更新Greeter.js並返回一個React組件

//Greeter,js
import React, {Component} from 'react'
import config from './config.json';

class Greeter extends Component{
  render() {
    return (
      <div>
        {config.greetText}
      </div>
    );
  }
}

export default Greeter

修改main.js以下,使用ES6的模塊定義和渲染Greeter模塊

// main.js
import React from 'react';
import {render} from 'react-dom';
import Greeter from './Greeter';

render(<Greeter />, document.getElementById('root'));

從新使用npm start打包,若是以前打開的本地服務器沒有關閉,你應該能夠在localhost:8080下看到與以前同樣的內容,這說明react和es6被正常打包了

localhost:8080

4.2 Babel的配置

Babel其實能夠徹底在 webpack.config.js 中進行配置,可是考慮到babel具備很是多的配置選項,在單一的webpack.config.js文件中進行配置每每使得這個文件顯得太複雜,所以一些開發者支持把babel的配置選項放在一個單獨的名爲 ".babelrc" 的配置文件中

module.exports = {
    entry: __dirname + "/app/main.js",//已屢次說起的惟一入口文件
    output: {
        path: __dirname + "/public",//打包後的文件存放的地方
        filename: "bundle.js"//打包後輸出文件的文件名
    },
    devtool: 'eval-source-map',
    devServer: {
        contentBase: "./public",//本地服務器所加載的頁面所在的目錄
        historyApiFallback: true,//不跳轉
        inline: true//實時刷新
    },
    module: {
        rules: [
            {
                test: /(\.jsx|\.js)$/,
                use: {
                    loader: "babel-loader"
                },
                exclude: /node_modules/
            }
        ]
    }
};
//.babelrc
{
  "presets": ["react", "env"]
}

到目前爲止,咱們已經知道了,對於模塊,Webpack能提供很是強大的處理功能

相關文章
相關標籤/搜索