邂逅Node

邂逅Node

1:浏览器内核

Geoko,Trident,Webkit,Blink

但是前端经常提到的浏览器内核一般是浏览器的排版引擎

排版引擎 ,浏览器引擎,页面渲染引擎,样排引擎

2:比较常见的javascript引擎

SpiderMonkey:js作者开发

Chakra:微软开发

JavascriptCore:Webkit中的js引擎 apple开发

V8:谷歌的,脱颖而出

V8执行js代码的原理

3:Node

node是基于v8引擎的js运行环境

如果想在一台电脑运行多个node版本 那么可以借助nvm与n工具

但是这两个工具不支持windows,不过有其他人开发出了支持windows的版本

4:全局对象和模块化开发

process

node index.js env=development

可以在后面跟随传递参数 在index.js中根据console.log(process.argv)获取

console.clear() 清空

console.trace() 追踪 打印函数调用栈

常见全局对象

require,__dirname,__filename,module,URL,exports等,可以去官网查看更多全局对象

process,global,

计时器全局对象:setTimeout,setInterval,setImmediate(立即执行)

process.nextTick(()=>{

​ console.log(‘process.nextTick’)

})

1
2
3
setTimeout(()=>{
console.log('setTimeout)
},1000)

有的对象是因为在每个模块中都有,看起来像全局变量,在命令行是无法使用的

global全局对象:

1
2
console.log(global)
打印所有全局对象 //不是全部,一部分全局对象

global与window相似

window会将var的变量自动挂载到window,global不会,所有global.变量是不对的

模块化

最终目的:将程序划分为一个个结构,每个结构包含自己的逻辑到=代码,不会影响到其他作用域

可以暴露出变量,函数,对象供其他结构导入使用

js缺陷:var定义的变量作用域问题,没有模块化的问题 可以用立即执行函数解决

1
2
3
4
5
6
7
var module = (function(){
var name = 'zhangsan'
var age = '21'
return {
name,age
}
})()

Commonjs

exports,module.exports导出 require导入

1
2
3
4
5
a.js
exports.name = 'aaa'
b.js
let a = require('a.js')
console.log(a.name) // 'aaa'

module的原理 每个模块默认有个module指向一个空对象 exports.name = name 是将空对象中的name 变为 name

require是想办法将这个对象作为返回值返回 实际上是浅层拷贝

module.exports 与 exports 区别 exports是Module的一个实例 实际上exports是使用的module.exports

源码中将 module.exports = exports

require细节

require的查找规则

1:path/http模块

2:./ ../ / 开头 有后缀名按照后缀名查找 否则先查找不带后缀名 => .js => .json => .node

如果是目录名 那么就会去该目录查找.js .json .node

3:既不是模块也不是目录 那么就会去node_modules查找 //not found

模块的引入查找是数据结构图的便遍历 广度优先和深度优先

Node是采用的深度优先

AMD

require.js cuel.js

CMD

sea.js

ES Module

使用import 与 export

默认导出exort default 一个模块只能有一个

es module加载过程

是异步的script type=”module” 相当于加了async 并不会影响加载

es modole 原理

1
2
3
4
5
6
7
8
9
export {
name,age
} //相当于 {
const name = name,
const age = age
}
//如果是基本类型
import { name,age } from 'index.js'
name = '123' // 语法错误 不能直接修改const的值 如果name是引用地址可以修改