Jade Dungeon

nodejs

使用nvm管理不同版本的node

nodejs的版本变化很快。不同版本的nodejs与各个软件包之间不仅兼容性很差, 而且不同版本之间包的依赖关系复杂性。

所以要用一个工具来方便地不同的项目切换到对应的nodejs版本。

安装nvm

Node 10 with --experimental-repl-await provides a working REPL, today, that supports await!

安装nvm Linux

curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash 

查看nvm版本:

nvm -v

了解nvm的具体用法:

nvm --help  

修改bashrczshrc,增加代码补全:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

安装nvm windows

在github上下载nvm-setup.zip包。

https://github.com/coreybutler/nvm-windows/releases

解压后只有一个nvm-setup.exe。 安装到路径,例如:c:\programe\nvm

编辑配置文件c:\programe\nvm\settings.txt

root: C:\programe\nvm
path: C:\programe\nodejs
arch: 64
proxy: none
node_mirror: http://npm.taobao.org/mirrors/node/
npm_mirror: http://npm.taobao.org/mirrors/npm/

配置环境变量:

NVM_HOME:C:\programe\nvm
NVM_SYMLINK:C:\programe\nodejs
NODE_PATH:C:\programe\nodejs\node_modules
PATH:%PATH%;%NVM_HOME%;%NVM_SYMLINK%

使用nvm安装node

开启nvm管理服务:

nvm on

查看可以使用的node版本

nvm ls-remote  
nvm install v10.15.3
nvm use v10.15.3

安装好node中是自动安装npm,node package manage

遇到的问题:有时候我们打开一个新的shell后,会提示我们找不到node和npm的命令, 可是我们明明安装了?

我们看看我们的.bashrc中有没有这样两句

export NVM_DIR="/Users/YOURUSERNAME/.nvm"  
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm  

没有的话,就自己添加进去,然后使用

source .bashrc  

切换版本

每个项目的根目录下可以放置一个.nvmrc文件:

$ cat .nvmrc
v16.13.1

$ nvm use
nvm use
Found '/home/foo-bar/workspace/sample-node-project/.nvmrc' with version <v16.13.1>
Now using node v16.13.1 (npm v8.1.2)

npm包管理工具的使用。

初始化一个工程:

npm init  

当我们需要安装新的模块的时候,有两种情况。

全局安装

npm install -g packagename  
  • npm是安装node模块的工具,执行install命令;
  • -g表示在全局环境安装,以便任何项目都能使用它;
  • 最后是将要安装的node模块的名字。

一般安装以后要指定NODE_PATH

export NODE_PATH=/usr/lib/node_modules:/usr/local/lib/node_modules

设置国内源:

# 设成淘宝的
npm config set registry http://registry.npm.taobao.org/
# yarn config set registry http://registry.npm.taobao.org/
# 2.换成原来的
# npm config set registry https://registry.npmjs.org/

单独的外部组件,比如puppeteer要连带下载chrome设置特定的源:

npm config set puppeteer_download_host=https://npm.taobao.org/mirrors
npm install -g puppeteer

本地安装

  • 将安装包放在./node_modules下(运行npm时所在的目录)。
  • 可以通过require()来引入本地安装的包。

针对单个工程安装

首先进入工程根目录,然后我们使用

npm install packagename --save-dev  

来进行安装,加上--save,npm就会帮助我们下载最新的包, 并且添加进package.json文件。

使用其他的镜像

查看npm的软件源:

npm config get registry

设成淘宝的

npm config set registry http://registry.npm.taobao.org/

换成原来的

npm config set registry https://registry.npmjs.org/

也可以直接修改配置文件~/.npmrc

puppeteer_download_host=https://npm.taobao.org/mirrors  # 控制浏览器的包要下载chrome
registry=http://registry.npm.taobao.org/

淘宝npm扩展

由于你懂的原因,国内使用npm有时候并不能成功安装包。 所以我们可以使用淘宝的npm管理工具来管理。这样速度就会快很多。

我们可以使用一下命令进行全局安装

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

安装完成后使用

cnpm -v  
1.2.0  

以后我们就可以完全使用cnpm来代替npm了。

npm 代理管理工具 nrm

node registry manager https://www.npmjs.com/package/nrm

# install 镜像方式
npm --registry https://registry.npm.taobao.org install -g nrm
# 直接安装
npm install -g nrm
# show
nrm ls
# use registry
nrm use cnpm

临时使用某个代理

npm --registry https://registry.npm.taobao.org install express

自定义代理设置

npm config set registry https://registry.npm.taobao.org
# 配置后可通过下面方式来验证是否成功
npm config get registry
# info express
npm info express
# show all setting
npm config list
# edit npm config
npm config edit
# remove to officel
npm config delete registry
# remove disturl
npm config delete disturl

cnpm 方式使用

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

# Use to install
cnpm install expresstall express

使用国内镜像

推荐使用最后一种方法,一劳永逸,前面2钟方法都是临时改变包下载源。

方法一:指定临时config

通过 config 配置指向国内镜像源

npm config set registry http://registry.cnpmjs.org //配置指向源
npm info express  //下载安装第三方包

方法二:指定包

npm --registry http://registry.cnpmjs.org info express

方法三:改配置

在配置文件 ~/.npmrc 文件写入源地址

具体配置文件地址为node安装目录下的npmrc文件, 可直接在node安装目录下搜索 npmrc,这时会出现4个文件,

我的文件路径为D:\Program Files\nodejs\node_modules\npm: 选择没有后缀名的进行修改,直接,在最后添加一行 :

registry =https://registry.npm.taobao.org   //写入配置文件

查看JIT编译的结果

node foo.js --print_code --print_opt_code > output.txt

调试

打开Debug

打开调试:

node --inspect path/xxx.js

Debugger listening on ws://127.0.0.1:9229/890b7b49-c744-4103-b0cd-6c5e8036be95

打开调试,并暂停在程序开头:

$ node --inspect-brk path/xxx.js

Debugger listening on ws://127.0.0.1:9229/890b7b49-c744-4103-b0cd-6c5e8036be95

使用chrome调用调试客户端

Chrome DevTools可以作为 Nodejs的调试客户端。通过: http://127.0.0.1:9229/json/list查看可用的列表:

[{
  "description": "node.js instance",
  "devtoolsFrontendUrl": "chrome-devtools://devtools/bundled/js_app.html?experiments=true&v8only=true&ws=127.0.0.1:9229/26b84c7d-88d6-4451-8d47-ccbecc4e9654",
  "devtoolsFrontendUrlCompat": "chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/26b84c7d-88d6-4451-8d47-ccbecc4e9654",
  "faviconUrl": "https://nodejs.org/static/favicon.ico",
  "id": "26b84c7d-88d6-4451-8d47-ccbecc4e9654",
  "title": "javascript_u4bmain.js",
  "type": "node",
  "url": "file://C:_var_crawl_puppeteer_node-utils-for-bu_javascript_u4bmain.js",
  "webSocketDebuggerUrl": "ws://127.0.0.1:9229/26b84c7d-88d6-4451-8d47-ccbecc4e9654"
}]

其中devtoolsFrontendUrl就是我们需要访问的地址。

另一种方法是:chrome://inspect/#devices,直接点:inspect

例子

例子:HTTP Server

const HTTPUtil = require("http");
const URLUtil = require("url");
const util = require('util');
const queryStringUtil = require("querystring");

const server = http.createServer((request, response) => {
	let method     = request.method;
	let urlObj     = URLUtil.parse(request.url);
	let urlJsonObj = url.parse(request.url,true);	
	let pathname   = urlObj.pathname;
	let getQuery   = urlObj.query;

	let str = "Request " + method + ": " + pathname + " received." + 
		" query: " + getQuery;
	console.log(str);

	if (method === 'OPTIONS') {
		response.setHeader("Access-Control-Allow-Origin", "*");
		response.statusCode = 200;
	} else if (request.method === 'GET') {
		response.writeHead(200, {
			'Content-Type':'text/plain;charset=utf-8'});
		response.write(str);
		response.end();
	} else if (requese.method === 'POST') {
		// 存储数组空间
		let msg = [];
		// 接收到数据消息
		request.on('data', (chunk) => { if (chunk) { msg.push(chunk); } });
		// 接收完毕
			// 对buffer数组阵列列表进行buffer合并返回一个Buffer
		request.on('end',() => {
			let buf = Buffer.concat(msg);
			conosole.log(buf); //提取Buffer正确
			response.writeHead(200, {
				'Content-Type':'text/plain;charset=utf-8'});
			response.write(str);
		})                  
	}    
});
server.listen(8787, '127.0.0.1');

例子:安装websoceet组件ws

升级node到最新的稳定版本8.10.0作为默认版本:

nvm install 8.10.0
nvm use     8.10.0

安装websocket组件ws:

npm install ws

websocket服务端程序:

var WebSocketServer = require('ws').Server;
var	wss = new WebSocketServer({ port: 8181 });
wss.on('connection', function (ws) {
	console.log('client connected');
	ws.on('message', function (message) {
		console.log(message);
	});
});

执行:

node server.js

浏览器作为client:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Test WebSocket</title>
</head>
<body>
	
</body>
<script>
var ws = new WebSocket("ws://localhost:8181");
ws.onopen = function (e) {
	console.log('Connection to server opened');
};

function sendMessage(str) {
	ws.send(str);
};

sendMessage("Hello World!");
</script>
</html>