Windows 10 下 Node.js 入门

只愿长相守 提交于 2020-03-30 04:16:24

例子工程在此下载

Windows 下 Node.js 入门

NodeJS的历史就不说了,别人说过了。最最关键Google JavaScript V8 开发成功,运行效率很高,开放二次开发接口(C++库,功能类似常见的Lua,Python等脚本的的开放库)。本来V8主要给Chrome浏览器服务的,经不住运行效率太优秀了,所以就有人动起了开发Native端的JavaScript运行环境的主意。NodeJS是这个思路的产物。

这是官网

https://nodejs.org/ 英文

https://nodejs.org/zh-cn/  中文(除了API其它都中文了)

这个是一个有质量上乘的中文API NodeJS API文档的网址。

NodeJS中文网 http://nodejs.cn/

这是一个中文书籍《深入浅出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:\Program Files\nodejs\

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 是管理本地项目依赖性的描述文件

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://npm.taobao.org/

通过命令看现在的网址。默认网址是   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风格

const EventEmitter = require('events');
const util = require("util");

function MyEmitter()
{
    EventEmitter.call(this);
}

util.inherits(MyEmitter, EventEmitter);

const myEmitter = new MyEmitter();
myEmitter.on('event', () => {
    console.log('触发事件11');
});
myEmitter.emit('event');

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!