ccdat

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

动态编译:nodemon安装

https://www.cnblogs.com/JuFoFu/p/5140302.html?utm_source=tuicool&utm_medium=referral

在开发环境下,往往需要一个工具来自动重启项目工程,之前接触过 python 的 supervisor,现在写 node 的时候发现 supervisior 在很多地方都有他的身影,node 也有一个 npm 模块 supervisior 也是用来监控进程的,不过除了 supervisior 外,还有很多其他的工具,从 github 的评分上看,比较热门的有 forever,nodemon,node-dev,具体这些工具的区别可以参考这篇文章 Comparison: Tools to Automate Restarting Node.js Server After Code Changes ,个人觉得在开发环境还是用 nodemon,因为配置比较方便,文档也很清晰。所以这里先主要讲 nodemon。

nodemon用来监视node.js应用程序中的任何更改并自动重启服务,非常适合用在开发环境中。
nodemon将监视启动目录中的文件,如果有任何文件更改,nodemon将自动重新启动node应用程序。
为了减少频繁改代码造成频繁重启,可以配置时只监听一个主文件,修改完代码后改动一下该文件即可。

安装

npm install -g nodemon
启动应用
nodemon [your node app]
使用帮助
nodemon -h 或者 nodemon --help
如果没有在应用中指定主机和端口,可以在命令中指定:
nodemon ./server.js localhost 8080
开启debug模式
nodemon --debug ./server.js 80
在工程目录下新建 nodemon.json文件,配置如下:

{
    "restartable": "rs", 
    "ignore": [
        ".git", 
        "node_modules/**/node_modules"
    ], 
    "verbose": true, 
    "execMap": {
        "": "node", 
        "js": "node --harmony"
    }, 
    "watch": [
        "./bin/www"
    ], 
    "env": {
        "NODE_ENV": "development", 
        "PORT": "8888"
    }, 
    "ext": "js json", 
    "legacy-watch": false
}

nodemon 比较流行的原因之一就是它的可配置性比较高,下面是官网给出的配置文件 nodemon.json 的例子,加上我自己了解到的有用的一些配置,开发环境建议可以把每个参数都写上备用,生产环境就把没有必要的参数去掉,有些字段是可以在命令行模式以参数形式给出的,可以通过 -h 查看,下面逐个解释:

{
    "restartable": "rs", 
    "ignore": [
        ".git", 
        "node_modules/**/node_modules"
    ], 
    "verbose": true, 
    "execMap": {
        "": "node", 
        "test": "gulp test"
    }, 
    "events": {
        "start": "echo 'app start'", 
        "crash": "echo 'app crash'", 
        "exit": "echo 'app exit'", 
        "restart": "echo 'app restart'"
    }, 
    "ext": "js json", 
    "watch": [
        "./src/**"
    ], 
    "env": {
        "NODE_ENV": "env", 
        "PORT": "3000"
    }, 
    "legacy-watch": false
}

express安装

https://segmentfault.com/a/1190000015170332

npm install express -g // 全局安装express
npm install express-generator -g // 全局安装express脚手架,安装之后可以使用express命令
express --version // 检查express版本
mkdir app
cd app
/**
* 生成项目文件
* express 默认使用ajs模板,加上 -e 指定更友好的ejs模板
*/
express -e
npm intall // 安装依赖
npm start // 启动项目

如何修改程序启动的默认3000端口入口 文件 bin/www

 

CommonJS规范,同步加载模块,后端nodejs推荐使用,内置require、export方法,建议有时间去了解一下实现机制
AMD规范,异步加载模块,在Angular、Vue等前端框架使用,通过requierjs模块也可以在浏览器中使用
ES6是下一代JS规范的模块加载方式,暂时不够通用,node中建议还是使用CommonJS规范

es6之前的语法很乱,所以很多人想用其他更严格的语言编写然后转译为js,例如typescript、coffeescript等扩展语言。

当 npm install -g 模块中途断网失败时,该包的状态可能是不完全的导致uninstall也无效,这时只能到users/用户名/appdata/npm/nodemodules去删掉该模块并且删除npm.cmd命令

node模块
核心模块(node安装的),文件模块(自己写的import时带了相对路径.或..等的)、普通模块(从模块名引入的)
node对加载过的模块会缓存,且是缓存编译和执行后的对象,对同一模块二次加载时会使用缓存对象,且核心模块优先于文件模块的缓存,确保用户的同名模块不能覆盖核心模块
模块定位
模块中可以查看查询模块的路径:
console.log(module.paths)
JS引擎尝试查找模块(其实全局变量也是)一般是链式查找,即一层层向上查找,因此不建议模块太深。chrome引擎做的优化是建立hash路径加快查找,但这种比较怕eval,即动态生成变量添加到全局作用域(无法事先建立索引),所以eval is evil。
文件定位
node会给没有后缀的模块尝试添加.js(通过fs模块同步加载执行) .node(这是用c/c++写的addon,编译后node用dlopen函数执行,代价较高) .json(加载后用JSON.parse解析后返回对象)等后缀进行查找,其他后缀都当js文件加载,建议能加上的就加上。
当模块的package.json没有写main时则以index.js作为模块入口。

node模块编译后都会把模块代码放到立即执行函数中防止变量污染全局变量。
node里面有runInThisContext方法,和eval相似但只在当前模块作用域中添加东西,可用来混淆代码。其原理类似于执行Function.prototype.toString = xxx;改变编译过程。

100ms规则
JS引擎->绘制队列->HTML引擎,JS引擎会将要渲染的内容放入队列,队列满了时通过HTML引擎render,如果JS引擎处理超过100ms没有通知渲染,用户将感觉卡顿。常规解决方法是异步操作,还有webworker子进程等。

异步IO的几个关键词:单线程、事件循环、观察者、IO线程,除了用户代码不能并行外,文件IO、网络请求都可以经过异步并行执行。
node在windows平台下settimeout最小间隔大概为15ms。
process.nettick将回调放到下次事件循环中执行,比settimeout(func,0)更高效(直接插到队列尾,不用查一遍红黑树),todo:对比process.setImediate

node应用
纯耗cpu的应用,上云走云计算;
部分cpu部分耗io的,耗cpu部分可以c/c++实现然后用node调用
新老系统兼容,例如老系统是html的输出,但新系统想要json的输出:
superagent 库访问拿到html
cheerio 在后端支持jquery语法,分析html取出数据
微信机器人框架:
chatie
区块链很爱用node
spring cloud是第一代微服务系统,有全家桶net flex,不太好跟node结合
istol是第二代微服务service mesh,跟node可以结合

socket.io实现websocket,客户端服务端全双工通信
webrtc基于websocket实现全双工的视频流传输、交流

posted on 2019-10-17 20:21  ccdat  阅读(292)  评论(0编辑  收藏  举报