您的位置:首页 > Web前端 > Node.js

Node.JS学习笔记

2020-06-29 04:33 776 查看

简介

node是js的运行时环境(RunTime)

浏览器js ES+DOM+BOM

node ES+核心模块

node能干什么?

  1. 可以创建高性能服务器
  2. 工具
  3. 中间件

进程和线程 进程 > 线程

进程表示一个程序,一个进程可以有多个线程

线程表示一条执行路径

node适合I/O密集不适合CPU密集(压缩、合并、加密、解密)

在node环境下,this表示{}空对象

times(setTimeout)

poll 放I/O操作

check 放setImmediate回调

global常见的属性

Buffer 二进制数据

process 进程 process.nextTick()

process常见的属性

platform 平台信息

cwd() 当前工作目录

env() 当前服务器环境

argv() 命令行参数

模块化方案

CommonJS规范 es6 module

  1. 模块 一个文件就是一个模块 模块之间相互独立
  2. 导入模块 require
    let str = require('./a.js');
  3. 导出模块 module.exports = xxx;
    const str = 'along';
    module.exports = str;

node模块分类

  1. 核心模块(内置模块) fs http…
  2. 自定义模块
  3. 第三方模块

fs方法:

异步读文件 fs.readFile()

同步读文件 fs.readFileSync(file)

判断是否存在该文件: fs.exists()/fs.existsSync

path处理路径模块

path.resolv(); // 把路径解析成绝对路径

__dirname 当前文件所在的目录

path.dirname(__dirname); // 取父目录

path.join(); // 拼接

path.extname(‘xxxx.txt’); // 取扩展名

vm.runInThisContext(code); // 执行code代码

手写CommonJS部分源码

require主要的过程:

  1. 将相对路径解析成绝对路径
  2. 读取该文件
  3. 让函数执行
(function(exprots, module, __dirname, __filename) {

})
let path = require('path');
let fs = require('fs');
let vm = require('vm');

function Module(id) {
this.id = id;
this.exprots = {};
}

Module.wrapper = [
'(function(exports, require, module, __dirname, __filename) {',
'\n})'
]

/**
* 对象-这是es6的简写语法
*/
Module._extensions = {
'.js' (module) {
// 用fs实例读取module文件 js返回一个字符串信息
let script = fs.readFileSync(module.id, 'utf8');
// 使用拼接 得到一个字符串返回值
let fnStr = Module.wrapper[0] + script + Module.wrapper[1];
// 使用vm的方法编译字符串方法 返回一个函数
let fn = vm.runInThisContext(fnStr);
// 给module.exports 取个别名
let exports = module.exports;
fn.call(exports, exports, require, module, path.dirname, module.id);
},
'.json' (module) {

}
}

/**
* 解析路径
*/
function resolveFilename(modulePath) {
// 1 路径解析成绝对路径
let res = path.resolve(__dirname, modulePath);
// 2 判断该文件是否存在 不存在尝试添加 .js .json
let isExists = fs.existsSync(res);
if (isExists) {
return res;
} else {
let keys = Object.keys(Module._extensions);
for	(var i = 0 i < keys.length; i++) {
let tryFilename = res + keys[i];
if (fs.existsSync(tryFilename)) {
return tryFilename;
}
}
throw new Error('module not find');
}
}

function tryModuleLoad(module) {
// 获取模块的扩展名
let extname = path.extname(module.id);
// 根据扩展名读取相应的文件
Module._extensions[extname](module);
}

function myReq(modulePath) {
let absPath = resolveFilename(modulePath);
let module = new Module(absPath);
tryModuleLoad(module);
}

面试题:module.exports 和exports的区别

exports 是 module.exports 的别名,因为 requier() 返回的是module.exports

所以对 export 重新赋值,我们拿不到该值,但是可以 exports.xxx = xxx 获取值

一般导出一个成员 直接 module.exports = 成员

多个成员 exports.成员1 = 值1 exports.成员2 = 值2 …

npm

概述

node package manager

包,多个文件的集合

包的分类

全局包 在命令行使用

​ 1. 安装 npm install *** -g

​ 2. 自己创建全局包

本地包 在项目中使用
npm install jquery --save(-S) 默认安装的是生产依赖

​ 生产依赖放在 “dependencies”: {} 以后删除依赖 可以通过nmp install 安装所有的依赖

​ npm install @babel/core --save-dev(-D)

​ 开发依赖放在 “devpendencies”: {}

​ npm install --production 安装生产依赖

​ 其他 “peerDependencies”: {}

​ “bundleadDependencies”: {}

​ “op”

package.json

npm init 初始化一个文件

npm init -y 一路默认下去

nodemon

功能:每次源文件修改后 自动执行

安装:npm install nodemon -g

使用:nodemon **.js

npm(node package manager)、nrm(npm registry manager)、nvm(node version manager)

nrm安装:npm i nrm -g

package-lock.json

锁定包的版本

模块加载机制

模块有路径没有后缀名

  1. 首先找同名js 找到则执行
  2. 找不到则找同名js文件夹
  3. 假如找到同名js文件夹,会找package.json文件main选项指定的入口文件
  4. 假如package.json文件main选项指定的入口文件不存在或者没配置,则会找有没有index.js
  5. 没有index.js会报错

require加载机制

没有路径也没有后缀名

  1. 首先会假设这是系统模块
  2. node 会去 node_modules文件夹
  3. 首先看有没有该名字的js
  4. 再看有没有该名字的文件夹
  5. 假如找到同名js文件夹,会找package.json文件main选项指定的入口文件
  6. 假如package.json文件main选项指定的入口文件不存在或者没配置,则会找有没有index.js
  7. 没有index.js会报错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: