npm,pm2等相关知识的学习
现在开始接手node端测试,有好多知识点,比如启动进程的命令,查看进程的命令都不是很清晰,现在具体来学习下~
npm由来
前端最大的社区是GitHub,大家在这里分享代码,讨论问题,收集学习资源。大家需要依赖什么安装包从以前的去官网下载到去GitHub下载,还是很麻烦。这时候一个拥有三大美德的程序员 Isaac Z. Schlueter (以下简称 Isaaz)给出一个解决方案:用一个工具把这些代码集中到一起来管理吧!
这个工具就是他用 JavaScript (运行在 Node.js 上)写的 npm,全称是 Node Package Manager
NPM 的实现思路大概是这样的:
- 买个服务器作为代码仓库(registry),在里面放所有需要被共享的代码
- 发邮件通知 jQuery、Bootstrap、Underscore 作者使用 npm publish 把代码提交到 registry 上,分别取名 jquery、bootstrap 和 underscore(注意大小写)
- 社区里的其他人如果想使用这些代码,就把 jquery、bootstrap 和 underscore 写到 package.json 里,然后运行 npm install jquery,npm 就会帮他们下载代码
- 下载完的代码出现在 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
npm,pm2等相关知识的学习的更多相关文章
- Spring的配置相关知识(学习spring boot的预备知识)
我们经常说的控制反转(Inversion of Control-IOC)和依赖注入(dependency injection-DI)在Spring环境下是等同的概念,控制反转是通过依赖注入实现的.所谓 ...
- Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识
Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...
- 学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rails等)
这篇文章主要介绍了学习Ruby你需要了解的相关知识(rvm, gem, bundle, rake, rails等),需要的朋友可以参考下 Ruby 这个就不用多说了 RVM 用于帮你安装Rub ...
- OpenCV&Qt学习之四——OpenCV 实现人脸检测与相关知识整理
开发配置 OpenCV的例程中已经带有了人脸检测的例程,位置在:OpenCV\samples\facedetect.cpp文件,OpenCV的安装与这个例子的测试可以参考我之前的博文Linux 下编译 ...
- 暑假第五周总结(学习HBASE相关知识)
本周主要对HBASE的相关知识进行了学习,主要是通过视频的讲解了解到了HBASE的存储机制,HBASE的机制与普通的关系型数据库完全不同,HBASE以列进行存储,其主要执行的就是增删查操作,其更改主要 ...
- MySQL学习总结:提问式回顾 undo log 相关知识
原文链接:MySQL学习总结:提问式回顾 undo log 相关知识 1.redo 日志支持恢复重做,那么如果是回滚事务中的操作呢,也会有什么日志支持么? 也回滚已有操作,那么就是想撤销,对应的有撤销 ...
- 《Python网络编程》学习笔记--从例子中收获的计算机网络相关知识
从之前笔记的四个程序中(http://www.cnblogs.com/take-fetter/p/8278864.html),我们可以看出分别使用了谷歌地理编码API(对URL表示地理信息查询和如何获 ...
- 客户端相关知识学习(十二)之iOS H5交互Webview实现localStorage数据存储
前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...
- 客户端相关知识学习(十一)之Android H5交互Webview实现localStorage数据存储
前言 最近有一个需求是和在app中前端本地存储相关的,所以恶补了一下相关知识 webView开启支持H5 LocalStorage存储 有些时候我们发现写的本地存储没有起作用,那是因为默认WebVie ...
随机推荐
- 晚间测试13 A. Dove 打扑克 vector +模拟
题目描述 分析 这道题比较关键的一点就是要看出最终牌数的种类数不会超过 \(\sqrt{n}\) 种 知道了这个性质我们就可以用 \(vector\) 维护一个有序的序列 \(vector\) 中存放 ...
- 栈的C++实现
数据结构c++实现系列第一篇. 话不多说,直接上代码. sichstack.h (头文件) 1 #pragma once 2 #include<string> 3 4 namespace ...
- POI Excel 导入导出重点
HSSF是指2007年以前的,XSSF是指2007年版本以上的 这个还是比较好用的,这些总结来自Apache的官方向导的点点滴滴 详细的请参考http://poi.apache.org/spreads ...
- STM32入门系列-库帮助文档使用
在前面文件夹介绍时,提到了stm32f10x_stdperiph_lib_um.chm文件,此文件是库函数使用帮助文档,可以直接打开如下图. 因为STM32库函数非常多,我们不可能把所有的外设函数都记 ...
- [UOJ 275/BZOJ4737] 【清华集训2016】组合数问题 (LUCAS定理的运用+数位DP)
题面 传送门:UOJ Solution 这题的数位DP好蛋疼啊qwq 好吧,我们说回正题. 首先,我们先回忆一下LUCAS定理: \(C_n^m \equiv C_{n/p}^{m/p} \times ...
- linux 安装部署
[smb] service smb restart vim /etc/selinux/config systemctl stop firewalld.service(centos7 64) seten ...
- 对于STM32F103的USART的通讯调试
USART:(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步/异步串行接收/发送器USART是一个全双工通用同步/异步串行收发 ...
- Handler的源码和常见问题的解答不崩溃
Handler是Android中的消息处理机制,是一种线程间通信的解决方案,同时你也可以理解为它天然的为我们在主线程创建一个队列,队列中的消息顺序就是我们设置的延迟的时间,如果你想在Android中实 ...
- Kubernetes+Promethues+Cloud Alert实践分享
前言 容器集群管理系统 Kubernetes(简称K8s),为容器化的应用提供部署运行.容器编排.负载均衡.服务发现和动态伸缩等一系列完整功能,Prometheus 对 K8s 支持非常棒,能够自动发 ...
- nginx&http 第六章 http 协议学习 1
1.HTTP方法 GET :获取资源 ,GET 方法用来请求访问已被 URI 识别的资源 POST:传输(上传和下载)实体主体 ,POST 方法用来传输实体的主体.虽然用 GET 方法也可以传输实体的 ...