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
修改bashrc
或zshrc
,增加代码补全:
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>