Windows 下 Node.js 入门
NodeJS的历史就不说了,别人说过了。最最关键Google JavaScript V8 开发成功,运行效率很高,开放二次开发接口(C++库,功能类似常见的Lua,Python等脚本的的开放库)。本来V8主要给Chrome浏览器服务的,经不住运行效率太优秀了,所以就有人动起了开发Native端的JavaScript运行环境的主意。NodeJS是这个思路的产物。
这是官网
https://nodejs.org/zh-cn/ 中文(除了API其它都中文了)
这个是一个有质量上乘的中文API NodeJS API文档的网址。
这是一个中文书籍《深入浅出nodejs》的他人写的读书笔记。
nodejs深入学(1)概述 https://www.jianshu.com/p/37d16a63fbb9
在Windows上的安装,参考中文官网链接吧。
安装后,在Windows的CMD窗口通过 node -v, npm -v 检查安装正确性。
可以书写一个index.js, 内部只需下面一行代码,通过 node index.js 运行试试。
console.log("Hello Node JS, " + new Date());
和编写客户端浏览器JavaScript相比,为NodeJs编写应用主要的新知识点是它组织模块代码的思路。模块思路一定要懂,要做到能手写多模块简单应用。
上面的读书笔记需完整看完再加一点练习应该能够开窍。开不了窍说明JavaScript基础还不行,请基础踏实了再前行。
这里给出一个使用JavaScript语言手写NodeJS上运行的通过多模块来组织代码的简单例子应用。
参考最上方附件吧。代码就不贴了。不会运行例子说明学习程度不够,你明的。
安装后,Node.js 给环境变量 PATH 增加了两个值。这个路径尤其是后面npm那个路径,得经常去看看。
入门重要的路径
C:\Users\%USERNAME%\AppData\Roaming\npm
nvm —— Node.js 多版本管理工具
这是一个nvm扫盲贴
https://www.jianshu.com/p/d0e0935b150a
我们常常需要同时支持多个Node.js版本,例如你在node v8上开发了一个项目,在node v10开发了另外一个项目。这是同时维护两个版本就费心费力了。
nvm可以处理这个问题。下面是windows10上nvm的安装网址
https://github.com/coreybutler/nvm-windows/releases 下载 nvm-setup.zip
安装后的路径在这里
C:\Users\winsai\AppData\Roaming\nvm
下载的node版本也在这里
》》先卸载Windows 10 已有的Node.js 安装
》》解压nvm-setup.zip 安装
》》进入cmd,nvm v 看nvm版本
》》nvm list available 看可以安装的版本,找LTS(Long Term Support 提供长期技术支持)那一列的版本号
| CURRENT | LTS | OLD STABLE | OLD UNSTABLE | |--------------|--------------|--------------|--------------| | 11.4.0 | 10.14.2 | 0.12.18 | 0.11.16 | | 11.3.0 | 10.14.1 | 0.12.17 | 0.11.15 | | 11.2.0 | 10.14.0 | 0.12.16 | 0.11.14 | | 11.1.0 | 10.13.0 | 0.12.15 | 0.11.13 | | 11.0.0 | 8.14.0 | 0.12.14 | 0.11.12 | | 10.12.0 | 8.13.0 | 0.12.13 | 0.11.11 | | 10.11.0 | 8.12.0 | 0.12.12 | 0.11.10 | | 10.10.0 | 8.11.4 | 0.12.11 | 0.11.9 |
》》nvm install 10.14.2
》》nvm install 8.9.0
》》nvm list 看看安装了几个nodejs版本,哪个是当前版本
》》nvm use 10.14.2 切换版本
》》node -v && npm -v 看看当前node版本
》》nvm use 8.9.0 切换版本
》》node -v && npm -v 看看当前node版本
其他系统的nvm安装网址参考这个文档
https://docs.npmjs.com/downloading-and-installing-node-js-and-npm
调试支持
node --inspect 支持调试器 https://nodejs.org/zh-cn/docs/guides/debugging-getting-started
Visual Studio Code 1.10+
- 在 Debug 面板中,点击设置按钮打开
.vscode/launch.json
,选择 "Node.js" 进行初始化构建。
Node.js如何对 js 模块(commonjs下一个文件一个模块)编译
模块知识,参考读书笔记中主要在这里:
https://www.jianshu.com/p/20f73da34044
基于CommonJS模块规范,每一个模块文件都包含require、exports、module三个变量,同时,node API中还提供了__filename、__dirname这两个变量。这些,都是在编译过程中,由node进行的包装,并自动添加的,我们看一下编译后的样子:
(function (exports, require, module, __filename, __dirname) { var math = require('math'); exports.area = function (radius) { return Math.PI * radius * radius; }; });package.json是node npm工程描述。通过npm init 可以创建。npx命令https://www.jianshu.com/p/cee806439865npm命令https://www.npmjs.cn/ https://www.npmjs.com/npm命令
npm命令入门
package.json 是管理本地项目依赖性的描述文件
A package.json
file:
- 列出依赖 lists the packages that your project depends on.
- 指定依赖包的版本 allows you to specify the versions of a package that your project can use using semantic versioning rules.语义化版本
- 使得你的编译可以重现,别人拿到工程也轻松能实现编译 makes your build reproducible, and therefore much easier to share with other developers.
项目根目录下,输入npm init -y 可以快速初始化一个 package.json。其中name和version属性是必须需要的。
通过下列命令可以修改npm init 默认值
> npm set init.author.email "wombat@npmjs.com" > npm set init.author.name "ag_dubs" > npm set init.license "MIT"
- 如果你自己的模块依赖于某个包,并通过 Node.js 的
require
加载,那么你应该选择本地安装,这种方式也是npm install
命令的默认行为。 - 如果你想将包作为一个命令行工具,(比如 grunt CLI),那么你应该选择全局安装。
npm install <package_name>
淘宝npm镜像
npm连海外网络不佳,可以通过cnpm代替
通过命令看现在的网址。默认网址是 https://registry.npmjs.org/
npm config get registry
方法1 执行命令,以后npm都是通过taobao npm镜像安装
npm config set registry https://registry.npm.taobao.org
如果感觉错了,修改回来可以通过
npm config set registry https://registry.npmjs.org/
方法2 执行下面命令,以后cnpm命令可以通过taobao npm镜像安装,原来的npm还是访问海外地址。(注意--registry是本次npm安装<这里是安装cnpm>使用哪个镜像的意思)
npm install -g cnpm --registry=https://registry.npm.taobao.org
package.json 可以增加 dependencies devDependencies 两个属性指明运行时依赖包和开发室依赖包。
其中,包的版本就需要版本号规范semver
https://semver.org/lang/zh-CN/
https://juejin.im/post/5ad413ba6fb9a028b5485866
常见的这样用
兼容模块新发布的补丁版本:~16.2.0、16.2.x、16.2 兼容模块新发布的小版本、补丁版本:^16.2.0、16.x、16 兼容模块新发布的大版本、小版本、补丁版本:*、x
升级补丁版本号:npm version patch 升级小版本号:npm version minor 升级大版本号:npm version major
major.minor.patch
major 大版本,版本之间不兼容
minor 小版本,增加了功能,但保持大版本兼容,例如能用1.6.x,那么就能用1.7.x
patch 补丁版本,功能不增加,修复了bug。例如1.6.0和1.6.1
npm安装时保存到package.json中
参数 --save 运行依赖 例如 npm installl gulp --save
"dependencies": {
"gulp": "^4.0.0"
}
参数 --save-dev 开发依赖 npm installl gulp --save-dev
分享工程时,不需要把node_module上传(例如不用传到svn, git中)
只需要在新环境 npm install 就通过package.json的描述把依赖包下载下来。
Node.js 的定时器
node的内部实现是一个单线程,无限循环,没有事件就退出(有点像游戏引擎无限循环的写法)
定时器有三种 setTimeout setImmediate process.nextTick,其中setTimeout 事件才客户端服务端代码通用
例如
var process = require("process");
console.log("first log 44");
setTimeout(function(arg){
console.log("setTimeout 11, " + arg + ", " + new Date());
}, 0, "my args1");
setImmediate(function(arg){
console.log("setImmediate 22, " + arg + ", " + new Date());
}, "my args2");
process.nextTick(function(arg){
console.log("process.nextTick 33, " + arg + ", " + new Date());
}, "my args3");
Node.js 的JavaScript 对象类型继承
JavaScript的继承是通过原型链prototype继承的。ES6有内建 class 和 extends 但是那需要客户端有IE9或以上。本博客奔着TypeScript 去的,就不理会啥ES6了。
const util = require('util');
const EventEmitter = require('events');
function MyStream() {
EventEmitter.call(this);
}
util.inherits(MyStream, EventEmitter);
MyStream.prototype.write = function(data) {
this.emit('data', data);
};
Node.js 的事件
Node.js 的死循环,推出的标志就是是否还有执行中的代码,以及是否还有事件队列里的事件需要处理。都没有就退出了。
ES6风格
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('触发事件');
});
myEmitter.emit('event');
util风格
来源:https://www.cnblogs.com/nuets/p/10125492.html