早期进修 Node.js 的时刻 (2011-2012),有挺多是大年夜 PHP 转过来的,当时有部分人对于 Node.js 编辑完代码须要重启一下表示麻烦(PHP不须要这个过程),于是社区里的同伙就开端倡导应用 node-supervisor 这个模块来启动项目,可以编辑完代码之后主动重启。不过相对于 PHP 而言依旧不敷便利,因为 Node.js 在重启今后,之前的高低文都损掉了。

固然可以经由过程将 session 数据保存在数据库或者缓存中来削减重启过程中的数据损掉,不过如不雅是在临盆的情况下,更新代码的重启间隙是没法处理请求的(PHP可以,别的那个时刻 Node.js 还没有 cluster)。因为这方面的问题,加上本人是大年夜 PHP 转到 Node.js 的,于是大年夜那时开端思虑,有没有办法可以在不重启的情况下热更新 Node.js 的代码。
a.js
- var express = require('express');
- var b = require('./b.js');
- var app = express();
- app.get('/', function (req, res) {
- b = require('./b.js');
- res.send(b.num);
- });
- app.listen(3000);
b.js
- exports.num = 1024;
两个 JS 文件写好之后,大年夜 a.js 启动,刷新页面会输出 b.js 中的 1024,然后修改 b.js 文件中导出的值,例如修改为 2048。再次刷新页面依旧是本来的 1024。
而在 JavaScript 中:
再次履行一次 require 并没有刷新代码。require 在履行的过程中加载完代码之后会把模块导出的数据放在 require.cache 中。require.cache 是一个 { } 对象,以模块的绝对路径为 key,该模块的具体数据为 value。于是便开端做如下测验测验:
a.js
- var path = require('path');
- var express = require('express');
- var b = require('./b.js');
- var app = express();
- app.get('/', function (req, res) {
- if (true) { // 检查文件是否修改
- flush();
- }
- res.send(b.num);
- });
- function flush() {
- delete require.cache[path.join(__dirname, './b.js')];
- b = require('./b.js');
- }
- app.listen(3000);
再次 require 之前,将 require 之上关于该模块的 cache 清理掉落后,用之前的办法再次测试。结不雅发明,可以成功的刷新 b.js 的代码,输出新修改的值。
懂得到这个点后,就想经由过程该道理实现一个无重启热更新版本的 node-supervisor。在封装模块的过程中,出于情怀的原因,推敲供给一个类似 PHP 中 include 的函数来代替 require 去惹人一个模块。实际内部依旧是应用 require 去加载。以b.js为例,本来的写法改为 var b = include(‘./b’),在文件 b.js 更新之后 include 内部可以主动刷新,让外面拿到最新的代码。
- var include = require('./include');
- var express = require('express');
- var b = include('./b.js');
推荐阅读
移动互联网人口红利逐渐消退 华为Hi-Star晨星计划一触即发
【51CTO.com原创稿件】 据懂得,在2016岁尾,我国移动智能终端范围冲破13.7亿台,跟着人口红利减退,充分盘活、经营现有流量便成为了各行各业全新的机会与挑衅。经由过程近几年互联网手机>>>详细阅读
地址:http://www.17bianji.com/lsqh/34702.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示