webpack自动刷新与解析的使用

这次给大家带来webpack自动刷新与解析的使用,使用webpack自动刷新与解析的注意事项有哪些,下面就是实战案例,一起来看一下。

前端需要频繁的修改js和样式,且需要根据浏览器的页面效果不断的做调整;而且往往我们的开发目录和本地发布目录不是同一个,修改之后需要发布一下;另外一点就是并不是所有的效果都可以直接双击页面就能看到,我们常常需要在本地用nginx建一个站点来观察(自己电脑上ok了才放到测试环境去)。所以如果要用手工刷新浏览器和手动(或点击)发布,还要启动站点,确实是个不小的体力活。而这三点webpack可以帮我们做到。

webpack-dev-server

webpack是通过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:Html5ode_modules.bin’,就加上分号写在后面。

C:UsersAdministrator.9BBOFZPACSCXLG2AppDataRoamingpm;C:Program Files (x86)Microsoft VS Codein;E:Html5ode_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#bypass-the-proxy;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");    }};

登录后复制

View Code

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里面就可以写了。

相信看了本文案例你已经掌握了方法,更多精彩请关注【创想鸟】其它相关文章!

推荐阅读:

H5的缓存Manifest的使用

webpack的模块热替换详解

webpack的样式加载详解

JS事件先发布后订阅的方法

以上就是webpack自动刷新与解析的使用的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2782067.html

(0)
上一篇 2025年3月8日 16:25:59
下一篇 2025年3月6日 17:44:56

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • webpack怎么打包node.js

    这次给大家带来webpack怎么打包node.js,webpack打包node.js的注意事项有哪些,下面就是实战案例,一起来看一下。 安装依赖 代码如下: npm install –save-dev webpack babel-load…

    编程技术 2025年3月8日
    200
  • 怎样让webpack打包后的文件压缩变小

    这次给大家带来怎样让webpack打包后的文件压缩变小,让webpack打包后的文件压缩变小的注意事项有哪些,下面就是实战案例,一起来看一下。 以前一直使用 create-react-app 这个脚手架进行 react 开发,后面因为一些自…

    2025年3月8日
    200
  • React BootStrap框架如何使用

    这次给大家带来React BootStrap框架如何使用,使用React BootStrap框架的注意事项有哪些,下面就是实战案例,一起来看一下。 安装 【相关视频推荐:bootstrap教程】 在终端cd到你的项目目录下执行:$ npm …

    2025年3月8日
    200
  • 怎样实现微信web端后退强制刷新

    这次给大家带来怎样实现微信web端后退强制刷新,实现微信web端后退强制刷新的注意事项有哪些,下面就是实战案例,一起来看一下。 具体代码如下所示: //生成uuid var uuidChars = “0123456789ABCDEFGHIJ…

    编程技术 2025年3月8日
    200
  • vue中使用cropperjs

    这次给大家带来vue中如何使用cropperjs,vue中使用cropperjs的注意事项有哪些,下面就是实战案例,一起来看一下。 用vue的项目里需要对图片进行裁剪,于是使用了cropperjs,在使用的过程中也踩过一些坑,以下是在.vu…

    2025年3月8日
    200
  • Immutable及React应该如何使用

    这次给大家带来Immutable及React应该如何使用,Immutable及React使用的注意事项有哪些,下面就是实战案例,一起来看一下。 Immutable 可以给 React 应用带来数十倍的提升,也有人说 Immutable 的引…

    2025年3月8日
    200
  • 不调用的情况下怎么解决react-native WebView的返回处理

    这次给大家带来不调用的情况下怎么解决react-native WebView的返回处理,不调用的情况下解决react-native WebView的返回处理的注意事项有哪些,下面就是实战案例,一起来看一下。 1.前言 项目中有些页面内容是变…

    2025年3月8日 编程技术
    200
  • plotly.js 绘图库怎样使用

    这次给大家带来plotly.js 绘图库怎样使用,使用plotly.js 绘图库的注意事项有哪些,下面就是实战案例,一起来看一下。 本文介绍了plotly.js 绘图库入门使用教程,分享给大家,具体如下: Plotly 缘起 这两天想在前端…

    2025年3月8日
    200
  • webpack无法通过IP地址访问localhost怎么办?

    这次给大家带来webpack无法通过IP地址访问localhost怎么办?,处理webpack无法通过IP地址访问localhost的注意事项有哪些,下面就是实战案例,一起来看一下。 1、问题描述: 今天用 webpack (v1.14.0…

    编程技术 2025年3月8日
    200
  • webpack-dev-server怎么设置远程模式

    这次给大家带来webpack-dev-server怎么设置远程模式,webpack-dev-server设置远程模式的注意事项有哪些,下面就是实战案例,一起来看一下。 下面的package.json文件中配置的webpack-dev-ser…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论