欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解webpack-dev-server使用方法

 更新時間:2018年09月14日 09:21:01   作者:蘋果小蘿卜  
這篇文章主要介紹了詳解webpack-dev-server使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

記錄下webpack-dev-server的用法.

首先,我們來看看基本的webpack.config.js的寫法

 module.exports = {
    entry: './src/js/index.js',
    output: {
      path: './dist/js',
      filename: 'bundle.js'
    }
  }

配置文件提供一個入口和一個出口,webpack根據(jù)這個來進行js的打包和編譯工作。雖然webpack提供了webpack --watch的命令來動態(tài)監(jiān)聽文件的改變并實時打包,輸出新bundle.js文件,這樣文件多了之后打包速度會很慢,此外這樣的打包的方式不能做到hot replace,即每次webpack編譯之后,你還需要手動刷新瀏覽器。

webpack-dev-server其中部分功能就能克服上面的2個問題。webpack-dev-server主要是啟動了一個使用expressHttp服務器。它的作用主要是用來伺服資源文件。此外這個Http服務器client使用了websocket通訊協(xié)議,原始文件作出改動后,webpack-dev-server會實時的編譯,但是最后的編譯的文件并沒有輸出到目標文件夾,即上面配置的:

  output: {
    path: './dist/js',
    filename: 'bundle.js'
  }

注意:你啟動webpack-dev-server后,你在目標文件夾中是看不到編譯后的文件的,實時編譯后的文件都保存到了內(nèi)存當中。因此很多同學使用webpack-dev-server進行開發(fā)的時候都看不到編譯后的文件

下面來結合webpack的文檔和webpack-dev-server里部分源碼來說明下如何使用:

啟動

啟動webpack-dev-server有2種方式:

  • 通過cmd line
  • 通過Node.js API

配置

我主要講解下cmd line的形式,Node.js API形式大家去看下官方文檔。可通過npm script進行啟動。我的目錄結構是:

 app
  |__dist
  |  |__styles
  |  |__js
  |    |__bundle.js
  |  |__index.html
  |__src
  |  |__styles
  |  |__js
  |    |__index.js
  |__node_modules
  |__package.json
  |__webpack.config.js

content-base

設定webpack-dev-server伺服的directory。如果不進行設定的話,默認是在當前目錄下。

webpack-dev-server --content-base ./dist

這個時候還要注意的一點就是在webpack.config.js文件里面,如果配置了outputpublicPath這個字段的值的話,在index.html文件里面也應該做出調(diào)整。因為webpack-dev-server伺服的文件是相對publicPath這個路徑的。因此,如果你的webpack.config.js配置成這樣的:

 module.exports = {
    entry: './src/js/index.js',
    output: {
      path: './dist/js',
      filename: 'bundle.js',
      publicPath: '/assets/'
    }
  }

那么,在index.html文件當中引入的路徑也發(fā)生相應的變化:

 <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Demo</title>
  </head>
  <body>
    <script src="assets/bundle.js"></script>
  </body>
  </html>

如果在webpack.config.js里面沒有配置outputpublicPath的話,那么index.html最后引入的文件js文件路徑應該是下面這樣的。

 <!DOCTYPE html>
  <html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Demo</title>
  </head>
  <body>
    <script src="bundle.js"></script>
  </body>
  </html>

Automatic Refresh

webpack-dev-server支持2種自動刷新的方式:

  • Iframe mode
  • inline mode

這2種模式配置的方式和訪問的路徑稍微有點區(qū)別,最主要的區(qū)別還是Iframe mode是在網(wǎng)頁中嵌入了一個iframe,將我們自己的應用注入到這個iframe當中去,因此每次你修改的文件后,都是這個iframe進行了reload。

通過查看webpack-dev-server的源碼,lib路徑下的Server.js文件,第38-48行,分別新建幾個流,這幾個流保存了client文件夾下的相關文件:

 // Prepare live html page
  var livePage = this.livePage = new StreamCache();
  fs.createReadStream(path.join(__dirname, "..", "client", "live.html")).pipe(livePage);

  // Prepare the live js file
  var liveJs = new StreamCache();
  fs.createReadStream(path.join(__dirname, "..", "client", "live.bundle.js")).pipe(liveJs);

  // Prepare the inlined js file
  var inlinedJs = new StreamCache();
  fs.createReadStream(path.join(__dirname, "..", "client", "index.bundle.js")).pipe(inlinedJs);
 // Init express server
  var app = this.app = new express();

  // middleware for serving webpack bundle
  this.middleware = webpackDevMiddleware(compiler, options);

  app.get("/__webpack_dev_server__/live.bundle.js", function(req, res) {
    res.setHeader("Content-Type", "application/javascript");
    liveJs.pipe(res);
  });

  app.get("/webpack-dev-server.js", function(req, res) {
    res.setHeader("Content-Type", "application/javascript");
    inlinedJs.pipe(res);
  });

  app.get("/webpack-dev-server/*", function(req, res) {
    res.setHeader("Content-Type", "text/html");
    this.livePage.pipe(res);
  }.bind(this));

當使用Iframe mode時,請求/webpack-dev-server/index.html路徑時,會返回client/index.html文件,這個文件的內(nèi)容就是:

<!DOCTYPE html><html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"/>
<script type="text/javascript" charset="utf-8" src="/__webpack_dev_server__/live.bundle.js">
</script>
</head>
<body></body>
</html>

這個頁面會請求live.bundle.js,其中里面會新建一個Iframe,你的應用就被注入到了這個Iframe當中。同時live.bundle.js中含有socket.ioclient代碼,這樣它就能和webpack-dev-server建立的http server進行websocket通訊了。并根據(jù)返回的信息完成相應的動作。

Inline-mode,是webpack-dev-server會在你的webpack.config.js的入口配置文件中再添加一個入口,

module.exports = {
    entry: {
      app: [
        'webpack-dev-server/client?http://localhost:8080/',
        './src/js/index.js'
      ]
    },
    output: {
      path: './dist/js',
      filename: 'bundle.js'
    }
  }

這樣就完成了將inlinedJS打包進bundle.js里的功能,同時inlinedJS里面也包含了socket.ioclient代碼,可以和webpack-dev-server進行websocket通訊。

當然你也可以直接在你index.html引入這部分代碼:

<script src="http://localhost:8080/webpack-dev-server.js"></script>

不過Iframe modeInline mode最后達到的效果都是一樣的,都是監(jiān)聽文件的變化,然后再將編譯后的文件推送到前端,完成頁面的reload的。

Iframe mode

Iframe modecmd line不需要添加其他的內(nèi)容,瀏覽器訪問的路徑是:localhost:8080/webpack-dev-server/index.html。

這個時候這個頁面的header部分會出現(xiàn)整個reload消息的狀態(tài)。當時改變源文件的時候,即可以完成自動編譯打包,頁面自動刷新的功能。

Inline mode

使用inline mode的時候,cmd line需要寫成:

webpack-dev-server --inline --content-base ./dist

這個時候訪問的路徑是:localhost:8080/index.html

也能完成自動編譯打包,頁面自動刷新的功能。但是沒有的header部分的reload消息的顯示,不過在控制臺中會顯示reload的狀態(tài)。

Hot Module Replacement

開啟Hot Module Replacement功能,在cmd line里面添加--hot

webpack-dev-server --hot --inline --content-base ./dist

其他配置選項

  • --quiet 控制臺中不輸出打包的信息
  • --compress 開啟gzip壓縮
  • --progress 顯示打包的進度

還有一切其他的配置信息可以查閱官方文檔:

webpack-dev-server-cli

這是我的package.json的文件:

  {
 "name": "reptile",
 "version": "1.0.0",
 "description": "",
 "main": "index.js",
 "scripts": {
  "dev": "webpack-dev-server --devtool eval-source-map --progress --colors --hot --inline --content-base ./dist",
  "build": "webpack --progress --colors"
 },
 "author": "",
 "license": "ISC",
 "devDependencies": {
  "babel-core": "^6.13.2",
  "babel-loader": "^6.2.5",
  "babel-preset-es2015": "^6.13.2",
  "babel-preset-react": "^6.11.1",
  "css-loader": "^0.23.1",
  "react": "^15.3.1",
  "react-dom": "^15.3.1",
  "style-loader": "^0.13.1",
  "webpack": "^1.13.2",
  "webpack-dev-server": "^1.14.1"
 }
}

首先命令行:輸入 npm install 所有依賴。然后輸入npm run dev。在瀏覽器中打開localhost:8080/index.html,然后就可以愉快的開發(fā)咯。

本地搭建API Server

如果你在本地還啟動了一個api server,port為3000,這個server主要和你的前端應用進行數(shù)據(jù)交互。這個時候很顯然會出現(xiàn)跨域的問題,那么這個時候,你前端應用的入口文件應當是用你自己啟動的api server提供的。

 var express = require('express');
  var app = express();
  
  app.get('/', function(req, res) {
    res.send('xxx/xxx/index.html'); //這個地方填寫dist/index.html的路徑
  })

此外webpack.config.js:

 module.exports = {
    entry: './src/js/index.js',
    output: {
      path: './dist/js',
      filename: 'bundle.js',
      publicPath: 'localhost:8080/dist'
    },
    devServer: {
      '/get': {
        targer: 'localhost:3000',
        secure: false
      }
    }
  }

publicPath字段的內(nèi)容配置為絕對路徑。同時index.html文件中對js引用的路徑也改為絕對路徑

<script src="localhost:8080/dist/bundle.js"></script>

如果對web-dev-server還有其他問題的話,請留言告知。

另外2篇關于webpack的文章:

webpack1.x分包及異步加載套路
webpack2分包及異步加載套路

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • js實現(xiàn)簡單的聯(lián)動菜單效果

    js實現(xiàn)簡單的聯(lián)動菜單效果

    這篇文章主要介紹了js實現(xiàn)簡單的聯(lián)動菜單效果,涉及javascript針對頁面元素的遍歷、讀取及設置技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-08-08
  • js獲取dom的高度和寬度(可見區(qū)域及部分等等)

    js獲取dom的高度和寬度(可見區(qū)域及部分等等)

    網(wǎng)頁可見區(qū)域?qū)捇蚋摺⒕W(wǎng)頁正文全文寬或高以及網(wǎng)頁正文部分左或右,詳細請看下文,希望對大家有所幫助
    2013-06-06
  • 深入理解JavaScript?變量對象

    深入理解JavaScript?變量對象

    變量對象是與執(zhí)行上下文相關的數(shù)據(jù)作用域,存儲了在上下文中定義的變量和函數(shù)聲明,本文主要介紹了JavaScript?變量對象,具有一定的參考價值,感興趣的可以了解一下
    2022-05-05
  • BootStrap 附加導航組件

    BootStrap 附加導航組件

    Bootstrap 是一個用于快速開發(fā) Web 應用程序和網(wǎng)站的前端框架,主要基于 HTML、CSS、JAVASCRIPT 的。接下來通過本文給大家介紹BootStrap 附加導航組件的知識,感興趣的朋友一起學習吧
    2016-07-07
  • httpclient模擬登陸具體實現(xiàn)(使用js設置cookie)

    httpclient模擬登陸具體實現(xiàn)(使用js設置cookie)

    最簡單的方法就是通過得到的cookie定制一個httpclient,感興趣的朋友可以了解下本文
    2013-12-12
  • JavaScript實現(xiàn)音樂播放器

    JavaScript實現(xiàn)音樂播放器

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)音樂播放器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • JavaScript日期和時間的格式化及其它常用處理方法

    JavaScript日期和時間的格式化及其它常用處理方法

    這篇文章主要給大家介紹了關于JavaScript日期和時間的格式化及其它常用處理方法,JavaScript中可以使用Date對象來表示日期和時間,如果需要格式化日期和時間,可以使用Date對象的幾個方法和一些字符串操作方法來實現(xiàn),需要的朋友可以參考下
    2023-09-09
  • js實現(xiàn)雙人五子棋小游戲

    js實現(xiàn)雙人五子棋小游戲

    這篇文章主要為大家詳細介紹了js實現(xiàn)雙人五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 深入淺析JavaScript系列(13):This? Yes,this!

    深入淺析JavaScript系列(13):This? Yes,this!

    在這篇文章里,我們將討論跟執(zhí)行上下文直接相關的更多細節(jié)。討論的主題就是this關鍵字。實踐證明,這個主題很難,在不同執(zhí)行上下文中this的確定經(jīng)常會發(fā)生問題
    2016-01-01
  • javascrpt密碼強度校驗函數(shù)詳解

    javascrpt密碼強度校驗函數(shù)詳解

    這篇文章主要為大家詳細介紹了javascrpt密碼強度校驗函數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論