现在开始接手node端测试,有好多知识点,比如启动进程的命令,查看进程的命令都不是很清晰,现在具体来学习下~

npm由来

前端最大的社区是GitHub,大家在这里分享代码,讨论问题,收集学习资源。大家需要依赖什么安装包从以前的去官网下载到去GitHub下载,还是很麻烦。这时候一个拥有三大美德的程序员 Isaac Z. Schlueter (以下简称 Isaaz)给出一个解决方案:用一个工具把这些代码集中到一起来管理吧!

这个工具就是他用 JavaScript (运行在 Node.js 上)写的 npm,全称是 Node Package Manager

NPM 的实现思路大概是这样的:

  1. 买个服务器作为代码仓库(registry),在里面放所有需要被共享的代码
  2. 发邮件通知 jQuery、Bootstrap、Underscore 作者使用 npm publish 把代码提交到 registry 上,分别取名 jquery、bootstrap 和 underscore(注意大小写)
  3. 社区里的其他人如果想使用这些代码,就把 jquery、bootstrap 和 underscore 写到 package.json 里,然后运行 npm install jquery,npm 就会帮他们下载代码
  4. 下载完的代码出现在 node_modules 目录里,可以随意使用了。

这些可以被使用的代码被叫做「包」(package),这就是 NPM 名字的由来:Node Package(包) Manager(管理器)。node包管理器。

npm的应用

新版的nodejs 已经集成了npm,所以安装nodejs的时候,npm也一并安装好了。

常用命令:

安装模块:npm install <module name>

卸载模块:npm uninstall <module name>

更新模块:npm update <module name>

package.json...

在 NodeJS 项目中,会看到一个package.json,这个文件用来声明项目中使用的模块,这样在新的环境部署时,只要在 package.json 文件所在的目录执行npm install命令即可安装所需要的模块。

还有一些scripts脚本,可以执行一些命令,比如启动npm start

{
"name": "maimai_node",
"version": "0.0.0",
"private": true,
"scripts": {
"start": "DEBUG='app,body,rpc' gulp watch",
"pc": "DEBUG='app,body,rpc' gulp watch_pc",
"test": "DEBUG='app' mocha test/main.js --harmony -t 200000",
"dev": "DEBUG='' gulp watch",
"reload": "DEBUG='app,body,rpc' node --harmony --inspect app.js",
"dev:allocatememory": "DEBUG='app,body,rpc' gulp --max_old_space_size=4098 watch",
"growth": "DEBUG='app,body,rpc' gulp --gulpfile gulpfile.growth.js --max_old_space_size=4098 watch",
"build-lib": "node-gyp rebuild --directory native_lib",
"build-bundle": "webpack --config webpack.config.js --progress --display-optimization-bailout",
"lint": "CHANGED_LIST=`git diff-index --name-only HEAD | grep .js$`; if [[ $CHANGED_LIST ]]; then ./node_modules/.bin/eslint --fix `echo $CHANGED_LIST | xargs`; fi",
"precommit": "#npm run lint",
"watchNoBundle": "DEBUG='app,body' DEV_PATH=dev gulp --max_old_space_size=4098 watchNoBundle"
},
"dependencies": {
"autoprefixer": "6.0.3",
"autoprefixer-core": "6.0.1",
"babel": "6.5.2",
"babel-eslint": "^8.0.3",
"babel-plugin-transform-async-to-generator": "6.8.0",
"babel-polyfill": "6.9.1",
"babel-preset-es2015": "6.9.0",
"babel-preset-react": "6.11.1",
"babel-preset-stage-0": "6.5.0",
"babel-register": "6.9.0",
"babelify": "6.4.0",
"baobab": "2.0.1",
"base62": "1.1.0",
"bindings": "1.2.1",
"blob-util": "2.0.2",
"bluebird": "3.0.5",
"brfs": "1.4.1",
"bunyan": "1.8.2",
"canvas": "1.6.5",
"classnames": "^2.1.3",
"co": "4.6.0",
"co-child-process": "0.0.3",
"co-mocha": "1.1.2",
"co-request": "1.0.0",
"co-wechat-api": "3.8.2",
"co-wechat-oauth": "2.0.1",
"commander": "2.9.0",
"crc-32": "1.0.1",
"crypto-js": "^3.1.9-1",
"cssmin": "0.4.3",
"cuint": "0.2.0",
"date-utils": "1.2.17",
"debug": "2.2.0",
"detect-browser": "1.1.1",
"dtrace-provider": "0.8.5",
"echarts": "^4.0.4",
"echarts-for-react": "^2.0.8",
"email-validation": "0.1.2",
"emoji-strip": "^1.0.1",
"envify": "3.4.0",
"es6-promise": "3.0.2",
"event-stream": "3.3.2",
"eventemitter3": "^3.1.0",
"exenv": "^1.2.2",
"fastclick": "^1.0.6",
"find-remove": "1.0.1",
"form-data": "1.0.1",
"generic-pool": "2.2.0",
"gulp": "3.9.1",
"gulp-cssmin": "0.1.7",
"gulp-download": "0.0.1",
"gulp-imacss": "1.0.0",
"gulp-jade": "1.1.0",
"gulp-less": "3.0.3",
"gulp-nodemon": "2.0.4",
"gulp-postcss": "6.0.1",
"gulp-rename": "1.2.2",
"gulp-replace": "0.5.4",
"gulp-streamify": "1.0.2",
"gulp-uglify": "1.4.2",
"gulp-util": "3.0.6",
"gulp-watch": "4.3.5",
"gulp-zip": "3.1.0",
"heapdump": "0.3.7",
"highcharts": "^6.0.7",
"hls.js": "0.8.6",
"html2canvas": "^1.0.0-alpha.12",
"http-shutdown": "1.2.0",
"idcard": "4.1.0",
"imacss": "1.0.0",
"immutability-helper": "^2.9.0",
"in-view": "0.6.0",
"ioredis": "2.3.0",
"iscroll": "5.2.0",
"jade": "1.11.0",
"jade-loader": "0.8.0",
"jquery": "^3.3.1",
"js-base64": "2.3.2",
"json-loader": "0.5.4",
"jsonfile-promised": "0.0.1",
"jsonwebtoken": "5.4.0",
"klass": "1.4.1",
"koa": "1.2.4",
"koa-body": "1.4.0",
"koa-compose": "2.4.0",
"koa-cors": "0.0.16",
"koa-csrf": "2.3.0",
"koa-gzip": "0.1.0",
"koa-jade": "2.0.0",
"koa-mount": "1.3.0",
"koa-proxy": "0.4.1",
"koa-qs": "2.0.0",
"koa-rewrite": "1.1.0",
"koa-router": "5.2.3",
"koa-send": "3.1.0",
"koa-session": "3.3.1",
"koa-static": "1.4.9",
"koa-swig": "2.1.0",
"koa-views": "3.1.0",
"lodash": "^4.17.10",
"md5": "^2.2.1",
"md5-file-promise": "1.0.2",
"mobile-detect": "1.3.1",
"mocha": "2.3.3",
"modern-syslog": "^1.1.4",
"moment": "2.10.6",
"moment-mini": "2.18.1",
"mongoose": "4.4.12",
"mongoose-auto-increment": "5.0.1",
"mongoose-multitenant": "0.8.2",
"ms": "0.7.1",
"mysql": "2.14.1",
"nan": "2.6.2",
"nconf": "0.8.2",
"node-canvas-text": "1.0.2",
"node-fetch": "1.7.1",
"node-jsx": "0.13.3",
"node-rsa": "0.2.26",
"node-xml-lite": "0.0.5",
"nsqjs": "0.8.4",
"opentype.js": "0.7.1",
"pako": "0.2.8",
"platform": "^1.3.4",
"preload-js": "^0.6.3",
"prop-types": "15.6.0",
"protobufjs": "6.8.0",
"qiniu": "7.2.1",
"qrcode.react": "^0.8.0",
"qs": "6.5.1",
"radium": "^0.14.2",
"rapscallion": "^2.1.14",
"ratelimiter": "2.0.1",
"raven": "2.2.1",
"raw-body": "2.1.4",
"raw-loader": "0.5.1",
"react": "^15.6.1",
"react-addons-linked-state-mixin": "15.6.0",
"react-addons-pure-render-mixin": "15.6.0",
"react-autosuggest": "^9.3.4",
"react-bootstrap": "0.31.0",
"react-clipboard.js": "^1.1.3",
"react-countup": "^3.0.3",
"react-distpicker": "^1.0.1",
"react-dom": "15.6.1",
"react-fastclick": "^3.0.2",
"react-fullpage": "^0.1.18",
"react-helmet": "2.1.1",
"react-highcharts": "^16.0.2",
"react-id-swiper": "^1.6.8",
"react-infinite": "0.11.0",
"react-infinite-scroller": "1.0.13",
"react-iscroll": "2.0.3",
"react-lazyload": "^2.3.0",
"react-motion": "0.5.0",
"react-radio-group": "^3.0.3",
"react-scroll": "^1.7.10",
"react-side-effect": "1.0.2",
"react-slick": "^0.22.3",
"react-sticky": "5.0.0",
"react-swipe": "3.0.0",
"react-swipeable-views": "^0.12.4",
"react-swipeable-views-core": "^0.12.11",
"react-swipeable-views-utils": "^0.12.13",
"react-tap-event-plugin": "^2.0.1",
"react-tappable": "^1.0.4",
"react-timer-mixin": "0.13.3",
"react-transition-group": "^2.3.1",
"redis": "2.7.1",
"request": "2.65.0",
"retry": "0.8.0",
"rmc-picker": "^5.0.5",
"rmc-pull-to-refresh": "^1.0.11",
"routes": "2.1.0",
"save": "^2.3.2",
"semver": "5.0.3",
"simditor": "2.3.6",
"sphinxapi": "1.1.1",
"style-loader": "0.13.1",
"styled-components": "^3.4.10",
"superagent": "3.5.2",
"swig": "1.4.2",
"swipe-js-iso": "2.0.1",
"tiny-cookie": "0.5.4",
"truncate": "2.0.0",
"underscore": "1.8.3",
"underscore.string": "3.2.2",
"unicode": "^0.6.1",
"url-loader": "^1.1.2",
"urlsafe-base64": "1.0.0",
"uuid": "2.0.1",
"vinyl-source-stream": "1.1.0",
"watchify": "3.6.1",
"webpack-stream": "3.2.0",
"weixin-js-sdk": "1.2.0",
"weixin-pay": "1.1.6",
"whatwg-fetch": "0.10.0",
"zepto-webpack": "1.2.1"
},
"devDependencies": {
"aliasify": "2.0.0",
"babel-core": "6.26.0",
"babel-loader": "7.1.2",
"babel-preset-env": "1.6.1",
"colors": "^1.2.1",
"css-loader": "0.28.4",
"eslint": "^4.13.0",
"eslint-plugin-react": "^7.5.1",
"gulp-imagemin": "^4.1.0",
"gulp-plumber": "^1.2.0",
"happypack": "^4.0.0",
"hard-source-webpack-plugin": "0.11.1",
"husky": "^0.14.3",
"less": "^2.5.3",
"less-loader": "^4.1.0",
"react-tappable": "^1.0.4",
"stylelint": "^9.9.0",
"webpack": "3.10.0",
"webpack-bundle-analyzer": "2.8.2",
"webpack-livereload-plugin": "^1.2.0",
"webpack-merge": "4.1.1"
}
}

package.json

启动:npm start    就是执行   DEBUG='app,body,rpc' gulp watch

重启:npm restart

停止:npm stop

有时候采用上面的方式启动node服务时,会报out of memory的错。那么我们可以用下面的命令。

npm run dev:allocatememory  就如package.json所写,最大化内存。

 

我们还经常看见cnpm,这个是淘宝镜像。

由于国内连npm服务是比较慢的,所以淘宝就自己出了一个镜像,同步频率是10分钟一次,保证package跟npm一致。

$ npm install -g cnpm --registry=https://registry.npm.taobao.org

安装后就可以cnpm代替npm了。比如:cnpm install <module name>

pm2是什么

PM2(process manager)是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等

常见命令:

$ npm install pm2 -g # 命令行安装 pm2

$ pm2 start app.js -i 4 #后台运行pm2,启动4个app.js
# 也可以把'max' 参数传递给 start
# 正确的进程数目依赖于Cpu的核心数目
$ pm2 start app.js --name my-api # 命名进程
$ pm2 list # 显示所有进程状态
$ pm2 monit # 监视所有进程
$ pm2 logs # 显示所有进程日志
$ pm2 stop all # 停止所有进程
$ pm2 restart all # 重启所有进程
$ pm2 reload all # 0秒停机重载进程 (用于 NETWORKED 进程)
$ pm2 stop 0 # 停止指定的进程
$ pm2 restart 0 # 重启指定的进程
$ pm2 startup # 产生 init 脚本 保持进程活着
$ pm2 web # 运行健壮的 computer API endpoint (http://localhost:9615)
$ pm2 delete 0 # 杀死指定的进程
$ pm2 delete all # 杀死全部进程
运行进程的不同方式:
$ pm2 start app.js -i max # 根据有效CPU数目启动最大进程数目
$ pm2 start app.js -i 3 # 启动3个进程
$ pm2 start app.js -x #用fork模式启动 app.js 而不是使用 cluster
$ pm2 start app.js -x -- -a 23 # 用fork模式启动 app.js 并且传递参数 (-a 23)
$ pm2 start app.js --name serverone # 启动一个进程并把它命名为 serverone
$ pm2 stop serverone # 停止 serverone 进程
$ pm2 start app.json # 启动进程, 在 app.json里设置选项
$ pm2 start app.js -i max -- -a 23 #在--之后给 app.js 传递参数
$ pm2 start app.js -i max -e err.log -o out.log # 启动 并 生成一个配置文件
你也可以执行用其他语言编写的app ( fork 模式):
$ pm2 start my-bash-script.sh -x --interpreter bash
$ pm2 start my-python-script.py -x --interpreter python

npm,pm2等相关知识的学习的更多相关文章

  1. Spring的配置相关知识(学习spring boot的预备知识)

    我们经常说的控制反转(Inversion of Control-IOC)和依赖注入(dependency injection-DI)在Spring环境下是等同的概念,控制反转是通过依赖注入实现的.所谓 ...

  2. Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识

    Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...

  3. 学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rails等)

    这篇文章主要介绍了学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rails等),需要的朋友可以参考下     Ruby 这个就不用多说了 RVM 用于帮你安装Rub ...

  4. OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理

    开发配置 OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux 下编译 ...

  5. 暑假第五周总结(学习HBASE相关知识)

    本周主要对HBASE的相关知识进行了学习,主要是通过视频的讲解了解到了HBASE的存储机制,HBASE的机制与普通的关系型数据库完全不同,HBASE以列进行存储,其主要执行的就是增删查操作,其更改主要 ...

  6. MySQL学习总结:提问式回顾 undo log 相关知识

    原文链接:MySQL学习总结:提问式回顾 undo log 相关知识 1.redo 日志支持恢复重做,那么如果是回滚事务中的操作呢,也会有什么日志支持么? 也回滚已有操作,那么就是想撤销,对应的有撤销 ...

  7. 《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识

    从之前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),我们可以看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获 ...

  8. 客户端相关知识学习(十二)之iOS H5交互Webview实现localStorage数据存储

    前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...

  9. 客户端相关知识学习(十一)之Android H5交互Webview实现localStorage数据存储

    前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...

随机推荐

  1. 使用ML.NET模型生成器来完成图片性别识别

    什么是ML.NET? ML.NET 使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中. 借助此功能,可以使用应用程序的可用数据进行自动预测. 机器学习应用程序利用数据中的模式来进行预测 ...

  2. AngularJS——ui-router

    深究AngularJS--ui-router详解 原创 2016年07月26日 13:45:14 标签: angularjs / ui-router / ui-view 25043 1.配置使用ui- ...

  3. MONGODB01 - Prematurely reached end of stream 错误定位及修复

    最近项目在运行过程,当一段时间没有操作mongo,再次访问报错,如下 org.springframework.data.mongodb.UncategorizedMongoDbException: P ...

  4. 使用scrapy框架模拟登录

    scrapy模拟登录 注意:模拟登陆时,必须保证settings.py里的COOKIES_ENABLED(Cookies中间件) 处于开启状态 COOKIES_ENABLED = True 或# CO ...

  5. Dubbo 迈出云原生重要一步 - 应用级服务发现解析

    作者 | 刘军(陆龟)  Apache Dubbo PMC 概述 社区版本 Dubbo 从 2.7.5 版本开始,新引入了一种基于实例(应用)粒度的服务发现机制,这是我们为 Dubbo 适配云原生基础 ...

  6. DM的SQL优化入门笔记

    1.查看执行计划EXPLAIN SELECT A.C1+1,B.D2 FROM T1 A, T2 B WHERE A.C1 = B.D1; 2.执行计划: 1 #NSET2: [0, 16, 9] 2 ...

  7. ASP.NET Core框架揭秘[博文汇总-持续更新]

    第1部分 跨平台开发体验 1 跨平台开发体验 001 跨平台开发体验: Windows [上篇]         002 跨平台开发体验: Windows [中篇]        003 跨平台开发体 ...

  8. 信号-linux

    https://www.linuxjournal.com/article/3985 每个信号在 signal.h 头文件中通过宏进行定义,实际是在 signal.h 中定义,对于编号以及信号名的映射关 ...

  9. shell编程之trap命令

    trap command  signal trap捕获信号(软中断),command一般是linux命令 若为' '表示发生陷阱时为空指令,'-'表示发生陷阱时采用缺省指令 signal: HUP(1 ...

  10. 【java从入门到精通】day-07-逻辑运算符-位运算符-条件运算符-扩展赋值运算符

    逻辑与(&&).或(||).非(!) 示例: package operator;​public class Demo05 {    public static void main(St ...