了解 Node.js
Node.js 是一个基于 ChromeV8 引擎的 JAVAScript 运行环境,使用了一个事件驱动、非阻塞式 I/O 模型,让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与 php、Python/ target=_blank class=infotextkey>Python、Perl、Ruby 等服务端语言平起平坐的脚本语言 。Node 中增添了很多内置的模块,提供各种各样的功能 , 同时也提供许多第三方模块 。
模块的问题为什么要有模块
复杂的前端项目需要做分层处理,按照功能、业务、组件拆分成模块,模块化的项目至少有以下优点:
- 便于单元测试
- 便于同事间协作
- 抽离公共方法,开发快捷
- 按需加载,性能优秀
- 高内聚低耦合
- 防止变量冲突
- 方便代码项目维护
- CMD (SeaJS 实现了 CMD)
- AMD (RequireJS 实现了 AMD)
- UMD (同时支持 AMD 和 CMD)
- IIFE (自执行函数)
- CommonJS (Node 采用了 CommonJS)
- ES Module 规范 (JS 官方的模块化方案)
Node 中采用了 CommonJS 规范
实现原理:
Node 中会读取文件,拿到内容实现模块化,Require 方法 同步引用
tips:Node 中任何 js 文件都是一个模块,每一个文件都是模块
Node 中模块类型
- 内置模块 , 属于核心模块,无需安装,在项目中不需要相对路径引用,Node 自身提供 。
- 文件模块,程序员自己书写的 js 文件模块 。
- 第三方模块 , 需要安装, 安装之后不用加路径 。
操作文件都需要用到这个模块
const path = require('path'); // 处理路径
const fs = require('fs'); // file system
// // 同步读取
let content = fs.readFileSync(path.resolve(__dirname, 'test.js'), 'utf8');
console.log(content);
let exists = fs.existsSync(path.resolve(__dirname, 'test1.js'));
console.log(exists);
path 路径处理
const path = require('path'); // 处理路径
// join / resolve 用的时候可以混用
console.log(path.join('a', 'b', 'c', '..', '/'))
// 根据已经有的路径来解析绝对路径, 可以用他来解析配置文件
console.log(path.resolve('a', 'b', '/')); // resolve 不支持/ 会解析成根路径
console.log(path.join(__dirname, 'a'))
console.log(path.extname('1.js'))
console.log(path.dirname(__dirname)); // 解析父目录
vm 运行代码
字符串如何能变成 JS 执行呢?
1.eval
eval 中的代码执行时的作用域为当前作用域 。它可以访问到函数中的局部变量 。
let test = 'global scope'
global.test1 = '123'
function b(){
test = 'fn scope'
eval('console.log(test)'); //local scope
new Function('console.log(test1)')() // 123
new Function('console.log(test)')() //global scope
}
2.new Function
new Function () 创建函数时,不是引用当前的词法环境,而是引用全局环境,Function 中的表达式使用的变量要么是传入的参数要么是全局的值
Function 可以获取全局变量 , 所以它还是可能会有变量污染的情况出现
function getFn() {
let value = https://www.isolves.com/it/cxkf/bk/2023-11-24/"test"
let fn = new Function('console.log(value)')
return fn
}
getFn()()
global.a = 100 // 挂在到全局对象global上
new Function("console.log(a)")() // 100
3.vm
前面两种方式,我们一直强调一个概念 , 那就是变量的污染
VM 的特点就是不受环境的影响,也可以说他就是一个沙箱环境
在 Node 中全局变量是在多个模块下共享的,所以尽量不要在 global 中定义属性
所以 , vm.runInThisContext 可以访问到 global 上的全局变量,但是访问不到自定义的变量 。而 vm.runInNewContext 访问不到 global,也访问不到自定义变量 , 他存在于一个全新的执行上下文
const vm = require('vm')
global.a = 1
【Nodejs 的 CommonJS 规范实现原理】// vm.runInThisContext("console.log(a)")
vm.runInThisContext("a = 100") // 沙箱,独立的环境
console.log(a) // 1
vm.runInNewContext('console.log(a)')
console.log(a) // a is not defined
Node 模块化的实现node 中是自带模块化机制的,每个文件就是一个单独的模块 , 并且它遵循的是 CommonJS 规范 , 也就是使用 require 的方式导入模块,通过 module.export 的方式导出模块 。
推荐阅读
- 架构模式解析,探索常见架构模式的优势与适用性
- AI绘画揭示未知的特异功能
- 电脑选择单条内存或两条内存组建双通道内存的区别
- EPON和GPON:无源光纤网络的区别大揭秘
- 无监督学习中的聚类算法综述
- 关于 Redis ,这里有你不知道的知识
- 训练生成式人工智能在军事应用中的风险分析
- 非参数贝叶斯方法在机器学习中的应用
- 机器学习中的不平衡数据问题研究
- 修复Windows 10上“未安装音频输出设备”的错误