现在开始接手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. Cloudera Manager简介

    Hadoop家族 整个Hadoop家族由以下几个子项目组成: Hadoop Common: Hadoop体系最底层的一个模块,为Hadoop各子项目提供各 种工具,如:配置文件和日志操作等. HDFS ...

  2. 想买保时捷的运维李先生学Java性能之 垃圾收集器

    前言 垃圾收集算法是内存回收的方法论:垃圾收集器是内存回收的具体实现.Java虚拟机规范中对垃圾收集器应该如何实现并没有任何规定,因此不同的厂商.不同版本的虚拟机所提供的垃圾收集器都有很大的差别,并且 ...

  3. Java动态代理——框架中的应用场景和基本原理

    前言 之前已经用了5篇文章完整解释了java动态代理的原理,本文将会为这个系列补上最后一块拼图,展示java动态代理的使用方式和应用场景 主要分为以下4个部分 1.为什么要使用java动态代理 2.如 ...

  4. Flask简介与启动服务器

    Flask 一.简介 官方文档:http://flask.pocoo.org/ http://www.pythondoc.com/flask/index.html(中文) 1.概述 flask是一个非 ...

  5. CSP-S 2020模拟训练题1-信友队T1 四平方和

    题意简述 \(n\)是正整数,其四个最小的因子分别为\(d_1,d_2,d_3,d_4\). 求对于所有的\(n \le m\)满足 \[d_1^2+d_2^2+d_3^2+d_4^2=n \] 的\ ...

  6. 老大说新项目的结构和 xxx 项目一样就可以了,我 ……(使用 Maven Archetype 快速创建项目)

    前言 又要开发新项目了,还是创建新项目,怎么办?老大说按照 xxx 项目的结构创建一个新项目就可以了. 公众号:liuzhihangs,记录工作学习中的技术.开发及源码笔记:时不时分享一些生活中的见闻 ...

  7. 最新阿里Java后端开发面试题100道(P6-P7)

    面试题 1.什么是字节码?采用字节码的好处是什么?2. Oracle JDK 和 OpenJDK 的对比?3.Arrays.sort 和 Collections.sort 实现原理和区别4.wait ...

  8. JSP系列记录

    JSP就是可以实现在html中写Java代码 例: hello.jsp <%@page contentType="text/html; charset=UTF-8" page ...

  9. Hive Join优化

    在阐述Hive Join具体的优化方法之前,首先看一下Hive Join的几个重要特点,在实际使用时也可以利用下列特点做相应优化: 1. 只支持等值连接 2. 底层会将写的HQL语句转换为MapRed ...

  10. C++ 数据结构 4:排序

    1 基本概念 1.1 定义 排序是计算机内经常进行的一种操作,其目的是将一组"无序"的数据元素调整为"有序"的数据元素. 1.2 数学定义 假设含n个数据元素的 ...