node.js 基础

  • 什么是Node.js
  • Node.js 基础
  • NPM
  • 基于Node.js的Web开发
  • Node.js的调试

什么是Node.jsnode.org

与 JavaScript 的区别

  • 基于异步 I/O 相关接口
  • 基于 node_modules 和 require 的模块依赖
  • 提供 C++ addon API 与系统交互

Node.js 可以干什么?

  • Web 服务端:Web Server、爬虫
  • CLI 命令行脚本:webpack
  • GUI 客户端软件:VSCode、网易云音乐
  • IoT, 图像处理, 实时通讯,加密货币…
// 爬虫案例
\const puppeteer = require('puppeteer');
const url = 'https://movie.douban.com/subject/26100958/comments?sort=time&status=F';

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url);
  const data = await page.evaluate(() => {
    return Array.from(document.querySelectorAll('.comment-item'), cmt => ({
      user: cmt.querySelector('.comment-info a').innerText,
      content: cmt.querySelector('p').innerText
    }));
  });

  data.forEach(({ user, content }) => console.log(`${user}: ${content}`));
  await browser.close();
})();

2 Node.js 基础

Hello World

//index.js
console.log('Hello World')
➜  ~ node index.js
Hello World

读写文件

const fs = require('fs');
fs.readFile('test.txt', (err, data) => {
    console.log(data);
});
console.log('read file content');

模块

  • 内置模块:编译进 Node 中,例如 http fs net process path 等
  • 文件模块:原生模块之外的模块,和文件(夹)一一对应

使用内置模块

const fs = require('fs');
fs.readFile('a.text', (err, buffer) => {
  console.log(buffer);
})
const {readFile} = require('fs');
readFile('a.txt', (err, buffer) => {
  console.log(buffer);
})

使用文件模块

// app.js
var circle = require('./circle.js');
console.log('半径为4的圆面积是:' + circle.area(4));

定义模块

// circle.js
const pi = Math.PI;
exports.area = function (r) {
    return pi * r * r;
};
exports.circumference = function (r) {
    return 2 * pi * r;
};

模块加载

// 加载绝对路径文件
require('/foo/bar/a.js');

// 加载相对路径文件
require('../a.js');

// 加载无后缀的文件
require('../a');

// 加载外部模块
require('pkg-name');

模块类型

  • .js
  • .json
  • .node
  • .mjs

  • 模块路径查找
  • 绝对路径
  • 相对路径
    • 和当前路径处理为绝对路径
  • 模块/文件夹
    • 原生模块,直接读取缓存
    • [$NODE_PATH, ~/.node_modules,
      ./node_modules, …/node_modules, …]
  • 解析 package.json,查找 main 属性,没有则使用 index.j
  • 如果未找到,则报错

js 模块解析

// app.js
const circle = require('./circle.js');

 - require 并不是全局变量
 - 定义的变量 circle 会污染其他文件么?

js 模块解析

  • 通过 fs.readFileSync 同步拿到文件内容
  • 对内容进行包装
    • (function (exports, require, module, __filename, __dirname) { var circle = require('./circle.js'); console.log('The area is ' + circle.area(4)); });
  • 通过 vm.runInThisContext 执行
  • 获取 module 对象的值作为模块的返回值

模块缓存

  • 模块加载后会将返回值缓存起来
  • 下次加载时直接读取缓存结果,避免文件 I/O 和解析时间
  • 导出对象缓存在 Module._cache 对象上

3:NPM

  • 一个package.json文件应该存在于包顶级目录下
  • 二进制文件应该包含在bin目录下
  • JavaScript代码应该包含在lib目录下
  • 文档应该在doc目录下
  • 单元测试应该在test目录下

package.json

➜  star-plan npm init -y
Wrote to /Users/lizheming/star-plan/package.json:

{
  "name": "star-plan",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

package.json
Tip: 可以使用 `npm config set init.author.name` 等命令修改初始化时的默认值

包依赖

 "dependencies": {
    "accepts": "^1.2.2"
  },
  

 - 1.0.0 Must match version exactly
 - >1.0.0 Must be greater than version
 - >=1.0.0 <1.0.0 <=1.0.0
 - ~1.0.0 "Approximately equivalent to version"
 - ^1.0.0 "Compatible with version" 
 - 1.2.x 1.2.0, 1.2.1, etc., but not 1.3.0
 - * Matches any version
 - version1 - version2 Same as >=version1 <=version2.

制作、发布模块

  • npm login
  • npm logout
  • npm publish
  • npm unpublish

更新模块

  • npm version patch
  • npm version minor
  • npm version major

一个好的模块

  • Git && 清晰的源码
  • 浅显易懂的 README.md
  • 遵循 semver 规范的版本号
  • 高覆盖度的测试用例

4:基于 Node.js 的 Web 开发
Web

const http = require('http');
const server = http.createServer((req, res) => {
  res.end('Hello World');
});
server.listen(3000);

Koa

const Koa = require('koa');
const app = new Koa();

// response
app.use(ctx => {
  ctx.body = 'Hello Koa';
});

app.listen(3000);
  1. 逻辑分层
  2. 路由处理
  3. 数据解析、校验
  4. 限校验证
  5. Session、Cache
  6. 数据库、Redis
  7. 安全
    Koa 无规范约束,不利于团队开发中间件繁多,质量参差不齐,选择困难

ThinkJs

Features

  • 支持多人团队博客
  • 完善的 Md 支持,访问速度快
  • 操作便捷,配置丰富,支持主题更换
  • 文章多站推送
    安装
$ wget https://firekylin.org/release/latest.tar.gz
$ tar zvxf latest.tar.gz
$ cd firekylin
$ npm install 
$ npm start

API 开发 使用 RESTful API

RESTful 接口规范

  • 每个 API 都对应一种资源或资源集合
  • 使用 HTTP Method 来表示对资源的动作
  • 使用 HTTP Status Code 来表示资源操作结果

RESTful API

  1. GET /ticket 获取 ticket 列表
  2. GET /ticket/:id 查看某个具体的 ticket
  3. POST /ticket 新建一个 ticket
  4. PUT /ticket/:id 更新 id 为 12 的 ticket
  5. DELETE /ticket/:id 删除 id 为 12 的 ticekt
    创建 API 文件
simple-todo thinkjs controller -r ticket

   think-cli · Create: src/controller/rest.js
   think-cli · Create: src/controller/ticket.js
   think-cli · Create: src/logic/api/ticket.js

配置路由

// src/config/router.js
module.exports = [
  ['/ticket/:id?', 'rest'], // 配置 RESTful API 路由
]

没啥意思

NodeJS调试
https://zhuanlan.zhihu.com/p/41315709​​​​​​​

  • 日志调试
  • 断点调试
    • node --inspect
    • vscode
    • ndb

NodeJS 6.3+ 使用 node --inspect 参数启动可以在 Chrome 浏览器中调试,在 chrome://inspect 中可以发现你的项目并启动 devtool

Node 开发角色转换

  • 前段
    • 跟浏览器打交道,兼容性问题
    • 组件化
    • 加载速度、JS 执行性能、渲染性能
    • 错误监控
    • XSS、CSRF 等安全漏洞
  • 服务端
    • 数据库、Redis 等周边服务
    • 性能、内存泄露、CPU、机器管理
    • 服务监控、错误监控、流量监控、报警
    • SQL注入、目录遍历等安全漏洞
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值