美文网首页第三方
快速入门nodejs

快速入门nodejs

作者: 空气KQ | 来源:发表于2018-06-14 16:31 被阅读842次

安装不讲

输出nodejs

test.js

console.log('nodejs');
node test

引入 required 模块

创建一个Http服务器
server.js

http.createServer(function (request, response) {

    // 发送 HTTP 头部
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});

    // 发送响应数据 "Hello World"
    response.end('Hello World\n');
}).listen(8888);

// 终端打印如下信息
console.log('Server running at http://0.0.0.0:8888/');

node server.js
image.png image.png

NPM 使用介绍

新版的nodejs已经集成了npm
"npm -v" 来测试是否成功安装

  • 允许用户从NPM服务器下载别人编写的第三方包到本地使用。
  • 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用。
  • 允许用户将自己编写的包或命令行程序上传到NPM服务器供别人使用。

使用 npm 命令安装模块

npm install <Module Name>

常用的 Node.js web框架模块 express:

npm install express

express 包就放在了工程目录下的 node_modules 目录中,因此在代码中只需要通过 require('express') 的方式就好,无需指定第三方包路径。

var express = require('express');

全局安装-g

npm install express          # 本地安装
npm install express -g   # 全局安装
    1. 将安装包放在 /usr/local 下或者你 node 的安装目录。
    1. 可以直接在命令行里使用。

局部安装

    1. 将安装包放在 ./node_modules 下(运行 npm 命令时所在的目录),如果没有 node_modules 目录,会在当前执行 npm 命令的目录下生成 node_modules 目录。
    1. 可以通过 require() 来引入本地安装的包。

查看安装信息

npm list -g

某个模块的版本号

 npm list grunt

使用 package.json

Package.json 属性说明
name - 包名。

version - 包的版本号。

description - 包的描述。

homepage - 包的官网 url 。

author - 包的作者姓名。

contributors - 包的其他贡献者姓名。

dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。

repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。

main - main 字段指定了程序的主入口文件,require('moduleName') 就会加载这个文件。这个字段的默认值是模块根目录下面的 index.js。

keywords - 关键字

卸载模块

npm uninstall express

更新模块

npm update express

搜索模块

npm search express

创建模块 npm init

 npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg> --save` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
name: (nodejs) kongqi test nodejs
Sorry, name can only contain URL-friendly characters.
name: (nodejs) kongqi_test_nodejs
version: (1.0.0) 1.0.0
description: kongqi test nodejs
entry point: (hello.js) hello.js
test command: make hello
git repository:
keywords: kongqi test
author: kongqi
license: (ISC) MIT
About to write to /www/nodejs/package.json:

{
  "name": "kongqi_test_nodejs",
  "version": "1.0.0",
  "description": "kongqi test nodejs",
  "main": "hello.js",
  "dependencies": {
    "express": "^4.16.3"
  },
  "devDependencies": {},
  "scripts": {
    "test": "make hello",
    "start": "node server.js"
  },
  "keywords": [
    "kongqi",
    "test"
  ],
  "author": "kongqi",
  "license": "MIT"
}


Is this ok? (yes) YES

版本号

X.Y.Z三位,分别代表主版本号、次版本号和补丁版本号

  • 如果只是修复bug,需要更新Z位。
  • 如果是新增了功能,但是向下兼容,需要更新Y位。
  • 如果有大变动,向下不兼容,需要更新X位。

其他命令

NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。

NPM提供了很多命令,例如install和publish,使用npm help可查看所有命令。

使用npm help <command>可查看某条命令的详细帮助,例如npm help install。

在package.json所在目录下使用npm install . -g可先在本地安装当前命令行程序,可用于发布前的本地测试。

使用npm update <package>可以把当前目录下node_modules子目录里边的对应模块更新至最新版本。

使用npm update <package> -g可以把全局安装的对应命令行程序更新至最新版。

使用npm cache clear可以清空NPM本地缓存,用于对付使用相同版本号发布新版本代码的人。

使用npm unpublish <package>@<version>可以撤销发布自己发布过的某个版本代码。

国内镜像

淘宝 NPM 镜像

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

cnpm 命令来安装模块了

 cnpm install [name]

回调函数

Node.js 异步编程的直接体现就是回调
Node 使用了大量的回调函数,Node 所有 API 都支持回调函数
例如,我们可以一边读取文件,一边执行其他命令,在文件读取完成后,我们将文件内容作为回调函数的参数返回。这样在执行代码时就没有阻塞或等待文件 I/O 操作。这就大大提高了 Node.js 的性能,可以处理大量的并发请求。

阻塞与非阻塞

  • 1.阻塞:就像单线程cpu一样,一个任务由多个小任务组成,但是只能一个任务接一个任务流程的往想下走,谁在任务排序的前面就谁先执行,执行完了进行下一个,如果遇到错误,下面的小任务就不要做了,一直卡住。

  • 2.非阻塞:就像多线程cpu一样,一个任务由多个小任务组成,可以分开线程来做,哪个线程做分配到的任务,完成了对应的任务就行,某个线程的任务没做完那就做报对应的错,其他的不受影响。

阻塞代码实例

var fs = require("fs");

var data = fs.readFileSync('input.txt');

console.log(data.toString());
console.log("程序执行结束!");

非阻塞代码实例

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
    if (err) return console.error(err);
    console.log(data.toString());
});

console.log("程序执行结束!");

[root@localhost nodejs]# node sync.js
this is input.txt

程序执行结束!
[root@localhost nodejs]# node async.js
程序执行结束!
this is input.txt

[root@localhost nodejs]#

Node.js 事件循环

Node.js 是单进程单线程应用程序,但是因为 V8 引擎提供的异步执行回调接口,通过这些接口可以处理大量的并发,所以性能非常高。

事件驱动程序

Node.js 使用事件驱动模型,当web server接收到请求,就把它关闭然后进行处理,然后去服务下一个web请求。
当这个请求完成,它被放回处理队列,当到达队列开头,这个结果被返回给用户。
这个模型非常高效可扩展性非常强,因为webserver一直接受请求而不等待任何读写操作。(这也被称之为非阻塞式IO或者事件驱动IO)
在事件驱动模型中,会生成一个主循环来监听事件,当检测到事件时触发回调函数。

Node.js 有多个内置的事件,我们可以通过引入 events 模块,并通过实例化 EventEmitter 类来绑定和监听事件

// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();
// 引入 events 模块
var events = require('events');
// 创建 eventEmitter 对象
var eventEmitter = new events.EventEmitter();

// 创建事件处理程序
var connectHandler = function connected() {
   console.log('连接成功。');

   // 触发 data_received 事件
   eventEmitter.emit('data_received');
}

// 绑定 connection 事件处理程序
eventEmitter.on('connection', connectHandler);

// 使用匿名函数绑定 data_received 事件
eventEmitter.on('data_received', function(){
   console.log('数据接收成功。');
});

// 触发 connection 事件
eventEmitter.emit('connection');

console.log("程序执行完毕。");

node event.js
连接成功。
数据接收成功。
程序执行完毕。

Node.js EventEmitter

Node.js 所有的异步 I/O 操作在完成时都会发送一个事件到事件队列
EventEmitter 的核心就是事件触发与事件监听器功能的封装。

Emitter 支持 若干个事件监听器。

var events = require('events'); 
var emitter = new events.EventEmitter(); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener1', arg1, arg2); 
}); 
emitter.on('someEvent', function(arg1, arg2) { 
    console.log('listener2', arg1, arg2); 
}); 
emitter.emit('someEvent', 'arg1 参数', 'arg2 参数'); 
listener1 arg1 参数 arg2 参数
listener2 arg1 参数 arg2 参数
  • on 函数用于绑定事件函数
  • emit 属性用于触发一个事件
addListener(event, listener)
为指定事件添加一个监听器到监听器数组的尾部。

on(event, listener)
为指定事件注册一个监听器,接受一个字符串 event 和一个回调函数。

once(event, listener)
为指定事件注册一个单次监听器,即 监听器最多只会触发一次,触发后立刻解除该监听器。

removeListener(event, listener)
移除指定事件的某个监听器,监听器必须是该事件已经注册过的监听器。
它接受两个参数,第一个是事件名称,第二个是回调函数名称。

removeAllListeners([event])
移除所有事件的所有监听器, 如果指定事件,则移除指定事件的所有监听器。

setMaxListeners(n)
默认情况下, EventEmitters 如果你添加的监听器超过 10 个就会输出警告信息。 setMaxListeners 函数用于提高监听器的默认限制的数量。

listeners(event)
返回指定事件的监听器数组。

emit(event, [arg1], [arg2], [...])
按参数的顺序执行每个监听器,如果事件有注册监听返回 true,否则返回 false

类方法

listenerCount(emitter, event)
返回指定事件的监听器数量。

事件

newListener
event - 字符串,事件名称
listener - 处理事件函数

该事件在添加新监听器时被触发。

removeListener
event - 字符串,事件名称
listener - 处理事件函数

从指定监听器数组中删除一个监听器。需要注意的是,此操作将会改变处于被删监听器之后的那些监听器的索引。

var events = require('events');
var eventEmitter = new events.EventEmitter();

// 监听器 #1
var listener1 = function listener1() {
   console.log('监听器 listener1 执行。');
}

// 监听器 #2
var listener2 = function listener2() {
  console.log('监听器 listener2 执行。');
}

// 绑定 connection 事件,处理函数为 listener1
eventEmitter.addListener('connection', listener1);

// 绑定 connection 事件,处理函数为 listener2
eventEmitter.on('connection', listener2);

var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

// 处理 connection 事件
eventEmitter.emit('connection');

// 移除监绑定的 listener1 函数
eventEmitter.removeListener('connection', listener1);
console.log("listener1 不再受监听。");

// 触发连接事件
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " 个监听器监听连接事件。");

console.log("程序执行完毕。");

node event2
2 个监听器监听连接事件。
监听器 listener1 执行。
监听器 listener2 执行。
listener1 不再受监听。
监听器 listener2 执行。
1 个监听器监听连接事件。
程序执行完毕。

Node.js Buffer(缓冲区)

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类
编码

ascii - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。

utf8 - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。

utf16le - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至 U+10FFFF)。

ucs2 - utf16le 的别名。

base64 - Base64 编码。

latin1 - 一种把 Buffer 编码成一字节编码的字符串的方式。

binary - latin1 的别名。

hex - 将每个字节编码为两个十六进制字符。

Node.js Stream(流)

Stream 是一个抽象接口,Node 中有很多对象实现了这个接口。例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout(标准输出)
Stream 有四种流类型:

  • Readable - 可读操作。
  • Writable - 可写操作。
  • Duplex - 可读可写操作.
  • Transform - 操作被写入数据,然后读出结果。
    Stream 对象都是 EventEmitter 的实例
  • data - 当有数据可读时触发。
  • end - 没有更多的数据可读时触发。
  • error - 在接收和写入过程中发生错误时触发。
  • finish - 所有数据已被写入到底层系统时触发

从流中读取数据

var fs = require("fs");
var data = '';

// 创建可读流
var readerStream = fs.createReadStream('input.txt');

// 设置编码为 utf8。
readerStream.setEncoding('UTF8');

// 处理流事件 --> data, end, and error
readerStream.on('data', function(chunk) {
   data += chunk;
});

readerStream.on('end',function(){
   console.log(data);
});

readerStream.on('error', function(err){
   console.log(err.stack);
});

console.log("程序执行完毕");
node stream
程序执行完毕
this is input.txt

写入流

var fs = require("fs");
var data = 'www.kong-qi.com website';

// 创建一个可以写入的流,写入到文件 output.txt 中
var writerStream = fs.createWriteStream('output.txt');

// 使用 utf8 编码写入数据
writerStream.write(data,'UTF8');

// 标记文件末尾
writerStream.end();

// 处理流事件 --> data, end, and error
writerStream.on('finish', function() {
    console.log("写入完成。");
});

writerStream.on('error', function(err){
   console.log(err.stack);
});

console.log("程序执行完毕");

 node stream_write.js
程序执行完毕
写入完成。

管道流

一个输出流到输入流的机制

var fs = require("fs");

// 创建一个可读流
var readerStream = fs.createReadStream('input.txt');

// 创建一个可写流
var writerStream = fs.createWriteStream('output.txt');

// 管道读写操作
// 读取 input.txt 文件内容,并将内容写入到 output.txt 文件中
readerStream.pipe(writerStream);

console.log("程序执行完毕");

通过管道将input.txt文件写入到output.txt

链式流

链式是通过连接输出流到另外一个流并创建多个流操作链的机制。链式流一般用于管道操作。

var fs = require("fs");
var zlib = require('zlib');

// 压缩 input.txt 文件为 input.txt.gz
fs.createReadStream('input.txt')
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream('input.txt.gz'));

console.log("文件压缩完成。");

Node.js模块系统

为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。
文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。

创建模块

var hello = require('./hello');
hello.world();

hello.js

exports.world = function() {
  console.log('Hello World');
}

对象封装到模块
hello.js

function Hello() { 
    var name; 
    this.setName = function(thyName) { 
        name = thyName; 
    }; 
    this.sayHello = function() { 
        console.log('Hello ' + name); 
    }; 
}; 
module.exports = Hello;
//main.js 
var Hello = require('./hello'); 
hello = new Hello(); 
hello.setName('BYVoid'); 
hello.sayHello(); 

Node.js 函数

unction say(word) {
  console.log(word);
}

function execute(someFunction, value) {
  someFunction(value);
}

execute(say, "Hello");

匿名函数

function execute(someFunction, value) {
  someFunction(value);
}

execute(function(word){ console.log(word) }, "Hello");

Node.js 路由

路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码。

Node.js 全局对象

浏览器 JavaScript 中,通常 window 是全局对象, 而 Node.js 中的全局对象是 global,
所有全局变量(除了 global 本身以外)都是 global 对象的属性

相关文章

  • 快速入门nodejs

    安装不讲 输出nodejs test.js 引入 required 模块 创建一个Http服务器server.js...

  • (三)NodeJs快速入门

    本学习笔记是根据《Node.js开发指南》一书进行学习。前面的几篇是根据《深入浅出Node.js》学习,但是学习到...

  • React Native的极简手册

    安装入门 安装入门可以参考:React Native官方文档。 NodeJS知识储备:参考《NodeJS入门》。(...

  • nodejs npm vue vuex快速安装使用入门腾讯课堂

    nodejs npm vue vuex快速安装使用入门腾讯课堂视频教程https://ke.qq.com/web...

  • mongoose 入门指引

    一、快速入门 nodejs 安装 mongoose 现在往 dbs 这个数据库里面添加一个 students 文档...

  • Node入门到入门(Windows)

    Node入门到入门(Windows) 安装NodeJS和NPM 1.安装NodeJS和NPM ​ 打开...

  • nodejs入门

    nodejs入门 花了点时间整理了下nodejs入门的图谱,如果将整个图谱的点都过了一次,相信你的nodejs知识...

  • NODE.JS

    入门 NODE安装 http://www.runoob.com/nodejs/nodejs-install-set...

  • nodejs 学习路线

    <1--nodejs入门> 1.准备-- js语言入门: -- JavaScript 教程 ...

  • 库&插件&框架&工具

    nodejs 入门 nodejs 入门教程,大家可以在 github 上提交错误2016 年最好用的表单验证库 S...

网友评论

    本文标题:快速入门nodejs

    本文链接:https://www.haomeiwen.com/subject/anryeftx.html