最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

webpack刷新解析功能使用

来源:动视网 责编:小采 时间:2020-11-27 19:39:00
文档

webpack刷新解析功能使用

webpack刷新解析功能使用:这次给大家带来webpack刷新解析功能使用,webpack刷新解析的注意事项有哪些,下面就是实战案例,一起来看一下。前端需要频繁的修改js和样式,且需要根据浏览器的页面效果不断的做调整;而且往往我们的开发目录和本地发布目录不是同一个,修改之后需要发布一下
推荐度:
导读webpack刷新解析功能使用:这次给大家带来webpack刷新解析功能使用,webpack刷新解析的注意事项有哪些,下面就是实战案例,一起来看一下。前端需要频繁的修改js和样式,且需要根据浏览器的页面效果不断的做调整;而且往往我们的开发目录和本地发布目录不是同一个,修改之后需要发布一下


4.8080端口占用

如果默认的8080端口占用,WDS会换一个。比如用nginx先发布一个。

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

再启动WDS:

端口切到了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,变化了就去启动它。

这样就你可以让你的双手专心的开发了。

代理

不过有一点疑问,就是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就是两个为你干活的小弟。

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

推荐阅读:

Mac内安装nodejs、npm与cnpm

使用select组件案例详解

文档

webpack刷新解析功能使用

webpack刷新解析功能使用:这次给大家带来webpack刷新解析功能使用,webpack刷新解析的注意事项有哪些,下面就是实战案例,一起来看一下。前端需要频繁的修改js和样式,且需要根据浏览器的页面效果不断的做调整;而且往往我们的开发目录和本地发布目录不是同一个,修改之后需要发布一下
推荐度:
标签: 功能 使用 刷新
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top