Node.JS学习笔记
简介
node是js的运行时环境(RunTime)
浏览器js ES+DOM+BOM
node ES+核心模块
node能干什么?
- 可以创建高性能服务器
- 工具
- 中间件
进程和线程 进程 > 线程
进程表示一个程序,一个进程可以有多个线程
线程表示一条执行路径
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
- 模块 一个文件就是一个模块 模块之间相互独立
- 导入模块 require
let str = require('./a.js');
- 导出模块 module.exports = xxx;
const str = 'along'; module.exports = str;
node模块分类
- 核心模块(内置模块) fs http…
- 自定义模块
- 第三方模块
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主要的过程:
- 将相对路径解析成绝对路径
- 读取该文件
- 让函数执行
(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
锁定包的版本
模块加载机制
模块有路径没有后缀名
- 首先找同名js 找到则执行
- 找不到则找同名js文件夹
- 假如找到同名js文件夹,会找package.json文件main选项指定的入口文件
- 假如package.json文件main选项指定的入口文件不存在或者没配置,则会找有没有index.js
- 没有index.js会报错
require加载机制
没有路径也没有后缀名
- 首先会假设这是系统模块
- node 会去 node_modules文件夹
- 首先看有没有该名字的js
- 再看有没有该名字的文件夹
- 假如找到同名js文件夹,会找package.json文件main选项指定的入口文件
- 假如package.json文件main选项指定的入口文件不存在或者没配置,则会找有没有index.js
- 没有index.js会报错
- node.js 基础学习笔记1
- node.js 基础学习笔记2
- node.js学习笔记(二)--使用mongoose简单的CRUD操作及测试模块mocha的使用
- node.js学习笔记(4)--使用Express完成简单的登陆
- node.js学习笔记——跨域设置
- node.js 学习笔记003 :使用superagent和cheerio实现简单网页爬虫
- Node.js学习笔记3
- node.js学习笔记--node.js连接并使用mongoDB(4)
- 前端小白学习Node.js的笔记
- Node.js学习笔记
- Redux 学习笔记 --- node.js开发
- Node.js学习笔记——事件处理机制&事件环机制
- Node.js入门学习笔记(二)
- Node.js学习笔记(5)--文件简单操作
- node.js学习笔记之文件读写操作
- node.js学习笔记2——querystring (查询字符串,参数处理)
- node.js学习笔记-01 events
- Node.js 学习笔记(二)
- node.js在windows下的学习笔记(6)---安装Express
- 【收藏学习笔记】使用supervisor提高node.js调试效率