现在开始接手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. 《JavaScript高级程序设计》——第一章JavaScript简介

    第一章主要讲了JavaScript的诞生和发展.刚刚接触JavaScript的我,似乎对这些内容并不感兴趣,快速看了一遍就开始去看第二章了. 看完第一章,收获也就是了解到JavaScript由ECMA ...

  2. vue-cli2.0创建项目步骤

    Vue是近两年来比较火的一个前端框架(渐进式框架吧),与reactjs和angularjs三国鼎立,我不是职业前端,做过Vue,了解了一下React,听说过Angluar.我只能这么说,我来晚了,没经 ...

  3. C# 中的只读结构体(readonly struct)

    翻译自 John Demetriou 2018年4月8日 的文章 <C# 7.2 – Let's Talk About Readonly Structs>[1] 在本文中,我们来聊一聊从 ...

  4. SharedPreferences源码分析

    分析达成目标 了解基本实现 SharePreferences是否线程安全 SharePreferences的mode参数是什么 了解apply与commit的区别 导致ANR的原因 Android8. ...

  5. 【源码】spring循环引用

    spring在单例,非构造方法注入的情况下允许循环依赖 1.循环依赖 a引用b,b引用a.a创建的时候需要b,但是b没有创建,需要先去创建b,b创建的时候又没有a,这就出现的循环依赖的问题 2.为什么 ...

  6. Linux小项目/rhel-基于同步官网yum仓库数据搭建本地yum服务器

    本文的实验环境:aws上的Redhat 7.x , 同样也适用于Centos 7.x 简单说主要分为三步: (1) 向官网同步yum数据,可以根据具体情况,创建脚本及配置周期例行任务  (2) 搭建w ...

  7. 01.axios封装

    1. 始vue化项目 https://www.cnblogs.com/xiaonq/p/11027880.html   vue init webpack deaxios # 使用脚手架创建项目 dea ...

  8. Hadoop高可用

    一.原因 - NameNode是HDFS的黑心配置HDFS有事hadoop的核心组件 NameNode 在Hadoop及群众至关重要 - NameNode的宕机导致集群的不可用 二.解决方案 其中 N ...

  9. FloodFill算法详解及应用

    啥是 FloodFill 算法呢,最直接的一个应用就是「颜色填充」,就是 Windows 绘画本中那个小油漆桶的标志,可以把一块被圈起来的区域全部染色. 这种算法思想还在许多其他地方有应用.比如说扫雷 ...

  10. 自定义控件-只有横线的文本输入框(TxtLine)

    需求:在实际开发中,由于TextBox控件的背景色样式不美观,且TextBox不能直接设置背景颜色,因此需要使用自定义控件以实现如下效果 实现代码 public partial class TxtLi ...