亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

淺談webpack 自動刷新與解析

2024-05-06 16:43:39
字體:
來源:轉載
供稿:網友

前端需要頻繁的修改js和樣式,且需要根據瀏覽器的頁面效果不斷的做調整;而且往往我們的開發目錄和本地發布目錄不是同一個,修改之后需要發布一下;另外一點就是并不是所有的效果都可以直接雙擊頁面就能看到,我們常常需要在本地用nginx建一個站點來觀察(自己電腦上ok了才放到測試環境去)。所以如果要用手工刷新瀏覽器和手動(或點擊)發布,還要啟動站點,確實是個不小的體力活。而這三點webpack可以幫我們做到。

webpack-dev-serverwebpack

是通過webpack-dev-server(WDS)來實現自動刷新。WDS是一個運行在內存中的開發服務器(一個express)。啟動之后,它會檢測文件是否發生改變并再自動編譯一次。

1.安裝

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

先通過npm將其安裝到開發目錄。安裝完成之后會在node_modules/bin下找到。

2.npm啟動

然后修改package.json:(基于上一節)

"scripts": {  "start": "webpack-dev-server --env development",  "build": "webpack --env production" }

現在就可以通過npm run start 或者 npm start來啟動了。

webpack,自動刷新

啟動之后,可以看到Project is running at http://localhost:8080 上面。打開頁面

webpack,自動刷新

說明WDS已經幫我們自動建了一個站點.我們修改component.js ,cmd中會出現編譯,頁面會自動刷新。

webpack,自動刷新

3.直接啟動

官網介紹可以直接通過下面的命令啟動WDS。

webpack-dev-server --env development

但會出現webpack-dev-server --env development 不是內部命令的提示,這種問題都是環境變量的問題,將你開發的bin目錄設置到環境變量中即可,比如我的目錄是‘E:/Html5/node_modules/.bin',就加上分號寫在后面。

C:/Users/Administrator.9BBOFZPACSCXLG2/AppData/Roaming/npm;C:/Program Files (x86)/Microsoft VS Code/bin;E:/Html5/node_modules/.bin

webpack,自動刷新

4.8080端口占用

如果默認的8080端口占用,WDS會換一個。比如用nginx先發布一個。

server{   listen    8080;   location / {      root  E:/Html5/build;      index index.html index.htm;    }  }

再啟動WDS:

webpack,自動刷新

端口切到了8081。也可以手動配置端口:

 devServer:{  //...  port: 9000}

nodemon 自動啟動

WDS是監視開發文件的,webpack.config.js改變不會引起自動啟動。所以我們需要nodemon去做這件事情。

npm install nodemon --save-dev

先安裝在開發目錄,然后修改package.json:

 "scripts": {  "start": "nodemon --watch webpack.config.js --exec /"webpack-dev-server --env development/"",  "build": "webpack --env production" },

等于讓nodemon去監視webpack.config.js,變化了就去啟動它。

webpack,自動刷新

這樣就你可以讓你的雙手專心的開發了。

代理

不過有一點疑問,就是WDS這個站點的替代性,因為我們自己部署的nginx有一些api的代理。如果掛在WDS的這個默認站點上自然是無法訪問的。換句話說可否給WDS配置一個刷新路徑。如果文件改變去刷新指定的地址,或者讓我去配個代理。既然它本身是一個http服務器,肯定也有代理的功能。搜了下果然有:https://github.com/webpack/webpack-dev-server/tree/master/examples/proxy-advanced

module.exports = {  context: __dirname,  entry: "./app.js",  devServer: {    proxy: {      "/api": {        target: "http://jsonplaceholder.typicode.com/",        changeOrigin: true,        pathRewrite: {          "^/api": ""        },        bypass: function(req) {          if(req.url === "/api/nope") {            return "/bypass.html";          }        }      }    }  }}

即將api這個字段替換成http://jsonplaceholder.typicode.com/,并將其從原地址中刪掉,這樣就可以自己實現代理了。皆大歡喜!WDS是通過http-proxy-middleware來實現代理。更多參考:http://webpack.github.io/docs/webpack-dev-server.html;https://github.com/chimurai/http-proxy-middleware#options

but,這種刷新是怎么實現的呢?因為頁面上沒有嵌入什么別的js,去翻原碼 web-dev-server/server.js中有這么一段:

Server.prototype._watch = function(path) {  const watcher = chokidar.watch(path).on("change", function() {    this.sockWrite(this.sockets, "content-changed");  }.bind(this))  this.contentBaseWatchers.push(watcher);}

chokidar來監視文件變化,server的內部維護的有一個socket集合:

Server.prototype.sockWrite = function(sockets, type, data) {  sockets.forEach(function(sock) {    sock.write(JSON.stringify({      type: type,      data: data    }));  });}

sock是一個sockjs對象。https://github.com/sockjs/sockjs-client,從http://localhost:8080/webpack-dev-server/頁面來看,sockjs是用來通信記錄日志的。

var onSocketMsg = {  hot: function() {    hot = true;    log("info", "[WDS] Hot Module Replacement enabled.");  },  invalid: function() {    log("info", "[WDS] App updated. Recompiling...");    sendMsg("Invalid");  },  hash: function(hash) {    currentHash = hash;  },...}

我們在看app.js,其中有一個OnSocketMsg 對象。

var onSocketMsg = {  hot: function() {    hot = true;    log("info", "[WDS] Hot Module Replacement enabled.");  },  invalid: function() {    log("info", "[WDS] App updated. Recompiling...");    sendMsg("Invalid");  },  hash: function(hash) {    currentHash = hash;  },  "still-ok": function() {    log("info", "[WDS] Nothing changed.")    if(useWarningOverlay || useErrorOverlay) overlay.clear();    sendMsg("StillOk");  },  "log-level": function(level) {    logLevel = level;  },  "overlay": function(overlay) {    if(typeof document !== "undefined") {      if(typeof(overlay) === "boolean") {        useWarningOverlay = overlay;        useErrorOverlay = overlay;      } else if(overlay) {        useWarningOverlay = overlay.warnings;        useErrorOverlay = overlay.errors;      }    }  },  ok: function() {    sendMsg("Ok");    if(useWarningOverlay || useErrorOverlay) overlay.clear();    if(initial) return initial = false;    reloadApp();  },  "content-changed": function() {    log("info", "[WDS] Content base changed. Reloading...")    self.location.reload();  },  warnings: function(warnings) {    log("info", "[WDS] Warnings while compiling.");    var strippedWarnings = warnings.map(function(warning) {      return stripAnsi(warning);    });    sendMsg("Warnings", strippedWarnings);    for(var i = 0; i < strippedWarnings.length; i++)      console.warn(strippedWarnings[i]);    if(useWarningOverlay) overlay.showMessage(warnings);    if(initial) return initial = false;    reloadApp();  },  errors: function(errors) {    log("info", "[WDS] Errors while compiling. Reload prevented.");    var strippedErrors = errors.map(function(error) {      return stripAnsi(error);    });    sendMsg("Errors", strippedErrors);    for(var i = 0; i < strippedErrors.length; i++)      console.error(strippedErrors[i]);    if(useErrorOverlay) overlay.showMessage(errors);  },  close: function() {    log("error", "[WDS] Disconnected!");    sendMsg("Close");  }};

ok的時候觸發一個reloadApp

function reloadApp() {  if(hot) {    log("info", "[WDS] App hot update...");    var hotEmitter = __webpack_require__("./node_modules/webpack/hot/emitter.js");    hotEmitter.emit("webpackHotUpdate", currentHash);    if(typeof self !== "undefined") {      // broadcast update to window      self.postMessage("webpackHotUpdate" + currentHash, "*");    }  } else {    log("info", "[WDS] App updated. Reloading...");    self.location.reload();  }}

也就是說WDS先檢測文件是否變化,然后通過sockjs通知到客戶端,這樣就實現了刷新。之前WebSocket的第三方只用過socket.io,看起來sockjs也蠻好用的。不必外帶一個js,在主js里面就可以寫了。

小結:效率提高的一方面是將一些機械的重復性流程或動作自動化起來。WDS和nodemon就是兩個為你干活的小弟。

demo:webpack-ch2.rar

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品亚洲国产视频| 欧美高清videos高潮hd| 国产精品999| 91久久久亚洲精品| 美女福利视频一区| 日韩av中文字幕在线播放| 国产日韩在线播放| 538国产精品视频一区二区| 欧美最猛性xxxxx(亚洲精品)| 国产精品黄页免费高清在线观看| 成人黄色在线播放| 中文字幕亚洲情99在线| 国产最新精品视频| 北条麻妃在线一区二区| 亚洲精品午夜精品| 国产免费久久av| 91免费人成网站在线观看18| 欧美午夜xxx| 国产精品美女999| 欧美日韩国产精品一区二区三区四区| 91精品视频播放| 秋霞成人午夜鲁丝一区二区三区| 亚洲精品一区在线观看香蕉| 成人午夜在线影院| 91免费观看网站| 欧美国产日韩一区二区三区| 国产精品偷伦一区二区| 97国产精品久久| 久久久久久久久久久成人| 国产日韩在线观看av| 国产精品白嫩美女在线观看| 国产xxx69麻豆国语对白| 久久精品视频在线| 国产美女久久精品香蕉69| 亚洲成人精品久久| 久久久久久久久久久免费精品| 九九热视频这里只有精品| 欧美国产日韩二区| 亚洲第一区中文99精品| 91免费看视频.| 欧美午夜片在线免费观看| 亚洲精品欧美日韩| 欧美区二区三区| 亚洲人成在线电影| 亚洲人精品午夜在线观看| 国产精品久久久久久久久久99| 久久精品国产99国产精品澳门| 亚洲欧洲在线视频| 国产精品青草久久久久福利99| 国产精品中文字幕久久久| 欧美精品videosex牲欧美| 欧美性xxxxx极品| 日日骚久久av| 精品日本美女福利在线观看| 国产伦精品免费视频| 久久色在线播放| 91夜夜揉人人捏人人添红杏| 啊v视频在线一区二区三区| 国产精品中文久久久久久久| 国产v综合v亚洲欧美久久| 久久这里只有精品99| 日韩av在线免费观看一区| 午夜精品久久久久久久99黑人| 4k岛国日韩精品**专区| 国产精品 欧美在线| 亚洲a在线观看| 亚洲欧美一区二区三区在线| 欧美高清视频在线播放| 日韩国产高清污视频在线观看| 97视频在线播放| 国产精品一区二区3区| 久久久精品网站| 91欧美日韩一区| 成人黄色免费网站在线观看| 欧美高清性猛交| 国产精品视频一区二区高潮| 亚洲欧洲成视频免费观看| 亚洲成人在线视频播放| 久久免费精品日本久久中文字幕| 日韩美女视频中文字幕| 精品久久久久久久久久ntr影视| 亚洲国产黄色片| 欧美另类极品videosbestfree| 国产日韩欧美成人| 亚洲free性xxxx护士白浆| 国产精品看片资源| 久久精品中文字幕电影| 日韩精品极品在线观看播放免费视频| 精品成人乱色一区二区| 日韩在线视频线视频免费网站| 毛片精品免费在线观看| 日本午夜人人精品| 亚洲精品小视频在线观看| 精品高清一区二区三区| 岛国视频午夜一区免费在线观看| 成人黄色av网| 热久久免费视频精品| 日韩中文字幕免费视频| 国产精品69av| 性欧美xxxx交| 亚洲午夜激情免费视频| 亚洲精品视频免费| 国产精品99蜜臀久久不卡二区| 日韩的一区二区| 亚洲第一网站男人都懂| 成人免费xxxxx在线观看| 国产精品极品在线| 久久久久久欧美| 亚洲激情视频在线播放| 久久在精品线影院精品国产| 亚洲国产精品专区久久| 国产精品99导航| 日韩中文字在线| 日韩av免费网站| 欧美日韩中文字幕| 久久夜色精品国产| 自拍偷拍免费精品| 色综合老司机第九色激情| 欧美日韩国产在线播放| 亚洲欧美日韩第一区| 91视频免费在线| 国模精品视频一区二区三区| 亚洲第一天堂av| 欧美国产日本在线| 韩国欧美亚洲国产| xx视频.9999.com| 亚洲3p在线观看| 国产精品日韩在线观看| 国产丝袜高跟一区| 中文字幕av日韩| 国产精品入口日韩视频大尺度| 九九九热精品免费视频观看网站| 国产精品久久久久久久电影| 亚洲人成电影网站色| 中文字幕日韩在线观看| 亚洲香蕉伊综合在人在线视看| 9.1国产丝袜在线观看| 一区二区欧美久久| 中文字幕在线视频日韩| 欧美中文字幕精品| 亚洲成色www8888| 欧美精品福利视频| 日本一欧美一欧美一亚洲视频| 91高潮在线观看| 亚洲性夜色噜噜噜7777| 热99精品只有里视频精品| 国产精品久久一区主播| 精品国产一区二区三区在线观看| 欧美日韩中文在线观看| 国产精品第三页| 久久精品国产v日韩v亚洲| 欧美日韩高清区| 国精产品一区一区三区有限在线| 伊人久久男人天堂| 亚洲高清一二三区| 亚洲激情视频在线播放| 成人羞羞国产免费| 亚洲欧美日韩精品久久亚洲区| 日韩精品中文字幕有码专区| 欧美激情乱人伦| 91在线视频导航| 欧美超级乱淫片喷水| 亚洲免费av网址| 亚洲精品美女免费|