360前端星计划—Node.js 基础入门(李喆明)

1. 什么是 Node.js

是基于chrome js运行时建立的平台,基于V8引擎。简单来说Node.js是运行在服务端的JavaScript。

与JS的区别:

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

Node.js可以做什么?

  • Web 服务端:Web Server、爬虫
  • CLI 命令行脚本:webpack
  • GUI 客户端软件:VSCode、网易云音乐
  • loT, 图像处理, 实时通讯,加密货币…

2. Node.js 基础

2.1 模块

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

2.2 模块加载

// 加载绝对路径文件
require('/foo/bar/a.js');
// 加载相对路径文件
require('../a.js');
// 加载无后缀的文件
require('../a');
// 加载外部模块
require('pkg-name'); //从当前或上级或上上级查找直到查到底层根目录

2.3 模块类型

  • .js
  • .json 形成js对象
  • .node 二进制文件
  • .mjs

2.4 模块路径查找

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

2.5 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 对象的值作为模块的返回值

2.6 模块缓存

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

3. NPM

3.1 包管理

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

3.2 包依赖

"dependencies": {
    "accepts": "^1.2.2",
    "content-disposition": "~0.5.0",
    "cookies": "~0.7.0",
    "debug": "*",
    "delegates": "^1.0.0",
    "escape-html": "~1.0.1",
    "fresh": "^0.5.2",
    "only": "0.0.2",
    "parseurl": "^1.3.0",
    "statuses": "^1.2.0",
    "type-is": "^1.5.5",
    "vary": "^1.0.0"
  },

3.3 NPM问题

  • 速度问题
  • 安全问题
    • 查看源码看 Star
    • https://snyk.io/ 外部的检测服务
    • npm audit

4. 基于 Node.js 的 Web 开发

  • Koa:中间件的作用,无规范约束,不利于团队开发,中间件繁多,质量参差不齐,选择困难。

  • ThinkJS:规定了项目结构
    ├─src
    │ ├─bootstrap
    │ ├─config
    │ │ ├─config.js
    │ │ └─adapter.js
    │ ├─controller //路由
    │ │ ├─index.js
    │ ├─logic
    │ │ ├─index.js
    │ └─model //数据库
    ├─view //模板文件
    │ ├─index_index.html
    └─www //静态资源
    │ └─static
    │ ├─css
    │ ├─img
    │ └─js
    ├─development.js
    ├─production.js
    ├─package.json

TODO List 项目实战

功能列表

  • TODO List 的页面
  • API(RESTful 接口规范)
    • 获取 TOO 列表
    • 增加 TODO
    • 删除 TODO
      -更新 TODO 状态

RESTful 接口规范

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

数据校验

  • 提供了 Logic 机制转门用来支持数据校验
  • 文件和 Action 与 Controller 一一对应

模型的好处

  • 简化代码、提高效率
  • 不用太懂 SQL 语句也能操作数据库
  • 避免手写 SQL 语句的安全风险

5. Node.js 的调试

调试

参考:​​​​​​​使用 ndb 调试你的 Node.js 项目

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

Node 开发角色转换

  • 前端
    • 跟浏览器打交道,兼容性问题
    • 组件化
    • 加载速度、JS 执行性能、渲染性能
    • 错误监控
    • XSS、CSRF 等安全漏洞
  • 服务端
    • 数据库、Redis 等周边服务
    • 性能、内存泄露、CPU、机器管理
    • 服务监控、错误监控、流量监控、报警
    • SQL注入、目录遍历等安全漏洞
发布了8 篇原创文章 · 获赞 0 · 访问量 48

猜你喜欢

转载自blog.csdn.net/liu_ye96/article/details/105427634