經過簡單的配置,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
瀏覽器監聽你的代碼的修改,在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
Loaders是webpack提供的最激動人心的功能之一了。經過使用不一樣的loader,webpack有能力調用外部的腳本或工具,實現對不一樣格式的文件的處理,好比說分析轉換scss爲css,或者把下一代的JS文件(ES6,ES7)轉換爲現代瀏覽器兼容的JS文件,對React的開發而言,合適的Loaders能夠把React的中用到的JSX文件轉換爲JS文件。
Loaders須要單獨安裝而且須要在webpack.config.js中的modules關鍵字下進行配置,
Loaders的配置包括如下幾方面:
不過在配置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是什麼?
Babel實際上是一個編譯JavaScript的平臺,它能夠編譯代碼幫你達到如下目的:
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被正常打包了
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能提供很是強大的處理功能