例子工程在此下载javascript
Windows 下 Node.js 入门java
NodeJS的历史就不说了,别人说过了。最最关键Google JavaScript V8 开发成功,运行效率很高,开放二次开发接口(C++库,功能相似常见的Lua,Python等脚本的的开放库)。原本V8主要给Chrome浏览器服务的,经不住运行效率太优秀了,因此就有人动起了开发Native端的JavaScript运行环境的主意。NodeJS是这个思路的产物。node
这是官网git
https://nodejs.org/ 英文github
https://nodejs.org/zh-cn/ 中文(除了API其它都中文了)npm
这个是一个有质量上乘的中文API NodeJS API文档的网址。json
NodeJS中文网 http://nodejs.cn/gulp
这是一个中文书籍《深刻浅出nodejs》的他人写的读书笔记。windows
nodejs深刻学(1)概述 https://www.jianshu.com/p/37d16a63fbb9visual-studio-code
在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扫盲贴
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
.vscode/launch.json
,选择 "Node.js" 进行初始化构建。
模块知识,参考读书笔记中主要在这里:
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/cee806439865
npm命令https://www.npmjs.cn/ https://www.npmjs.com/npm命令
package.json 是管理本地项目依赖性的描述文件
A package.json
file:
项目根目录下,输入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"
require
加载,那么你应该选择本地安装,这种方式也是 npm install
命令的默认行为。npm install <package_name>
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/
http://www.javashuo.com/article/p-btfxutzf-ky.html
常见的这样用
兼容模块新发布的补丁版本:~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
参数 --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的内部实现是一个单线程,无限循环,没有事件就退出(有点像游戏引擎无限循环的写法)
定时器有三种 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");
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 的死循环,推出的标志就是是否还有执行中的代码,以及是否还有事件队列里的事件须要处理。都没有就退出了。
const EventEmitter = require('events');
class MyEmitter extends EventEmitter {}
const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
console.log('触发事件');
});
myEmitter.emit('event');