360星计划-node.js基础入门

一、什么是node.js

Node.js® is a JavaScript runtime built on Chrome’s V8 JavaScript engine.

与JavaScript的区别:

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

node.js可以干什么?

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

eg:爬虫爬取豆瓣电影内容

const puppeteer = require('puppeteer');
const url = 'https://movie.douban.com/subject/26794435';

(async () => {
     
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url);
  const film = await page.evaluate(() => {
     
    const title = $('h1 > span:first-child').text();
    const poster = $('#mainpic img').attr('src');
    const desc = $('span[property="v:summary"]').text().trim();
    return {
     title, poster, desc};
  });

  console.log(JSON.stringify(film, null, '  '));
  await browser.close();
})();

二、node.js基础

eg:Hello World:

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

eg:读写文件:

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

1、模块

  1. 内置模块:编译进 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);
})
  1. 文件模块:原生模块之外的模块,和文件(夹)一一对应
// app.js
var circle = require('./circle.js');
console.log('半径为4的圆面积是:' + circle.area(4));

2、定义模块

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

3、模块加载

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

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

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

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

4、模块类型

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

5、模块路径查找

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

6、js模块解析

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

require 并不是全局变量
定义的变量 circle 会污染其他文件么?(不会,在闭包内进行require,circle的上下文会在闭包里)

执行步骤:

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

7、模块缓存

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

三、NPM(Node Package Manager )

360星计划-node.js基础入门_第1张图片

四、基于Node.js的web开发

1、包管理

  1. 一个package.json文件应该存在于包顶级目录下(package.json文件上会有一些包的meta信息,包括包名、版本号、描述、依赖等)
  2. 二进制文件应该包含在bin目录下
  3. JavaScript代码应该包含在lib目录下
  4. 文档应该在doc目录下
  5. 单元测试应该在test目录下

2、package.json

➜  star-plan npm init -y //快速创建package.json文件
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"
}

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

重要的meta信息:

  1. main:作为node去查找模块的入口文件的字段,如果需要指定非index.json的文件,当node去查找这个模块时,会去读取package.json里的main字段,去查找对应入口文件,否则会使用根目录下index.json文件作为入口文件
  2. npm scripts:常用的脚本执行的快捷方式,可以在根目录下快速执行
  3. dependencies:
    1. dependencies:安装时要使用的依赖包
    2. devDependencies:开发时要使用的依赖包,安装时不需要使用
    3. peerDependencies:安装时必须要装的包
    4. bundledDependencies:安装时会捆绑安装的包
    5. optionalDependencies:安装时可以选择另外的包
  4. bin
  5. semver version:version格式,“a.b.c”(大版本a,中版本b,小版本c,小版本表示bug的修复、补丁的更新;中版本表示特性的增加;大版本表示代码可能进行重构,和之前版本可能是不兼容的)
  6. registry:表示npm的代理(指定npm的源指定到淘宝等内部源,使得可以快速安装依赖)

3、包依赖

包依赖示例:

 "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"
  },

包依赖的多种写法:

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.
...

4、npm的问题

  • 速度问题(国内速度较慢)
  • 安全问题(投毒事件、模块被删导致依赖安装失败)
    • 查看源码看 Star(npm被GitHub收购)
    • https://snyk.io/ 外部的检测服务
    • npm audit:能够快速检测模块漏洞

你可能感兴趣的:(360星计划,nodejs,npm)