提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
介绍node的常用输入、输出,全局对象,以及模块化相关的知识
一、node的输入,输出
1.1.node的输入
- 在执行index.js命令行的后面添加要输入的参数 node index.js xiaomi(输入’xiaomi’)
- 获取输入的参数在index.js中通过process.argv返回的是一个数组 (process.argv[2] ==> xiaomi)
1.2.node常用的输出
- 最常用的输出内容的方式:console.log()
- 清空控制台:console.clear()
- 打印函数的调用栈:console.trace()
二、node的全局对象
2.1 特殊的全局对象(模块中使用)
直接在命令行使用(终端中直接使用__dirname)是找不到的,必须在模块中使用(如在index.js中console.log(__dirname))
- 获取某个文件的目录名称 __dirname
- 获取某个文件名称 __filename
2.2 常见的全局对象
- process 提供node进程中相关的信息(如node的运行环境,参数信息(如上面提到的输入参数信息)等)
- console 打印内容
- setTimeout(()=>{},0)
- setInterval(()=>{},1000)
- setImmediate(()=>{})
- process.nextTick(()=>{})
- global对象(类似于浏览器的window对象)
三、聊聊JavaScript模块化(本身没有模块化)
3.1.模块化的概念
- 模块化最终的目的是将程序划分为一个个小的结构
- 在每个结构中编写属于自己的逻辑代码,有自己的作用域不会影响其它的结构
- 在结构中导出或导入一些 变量,函数,对象等
3.1.1.没有模块化时候的解决方法(示例):
//a.js模块(导出)
//通过立即执行函数导出一个对象(因为函数是有作用域)
var moduleBar = (function () {
var name = "小明";
var age = 18;
console.log(name);
return {
name,
age
}
})()
//b.js模块(导入)
console.log(moduleBar.name);
console.log(moduleBar.age);
缺点:必须记住每个模块中返回对象的命名(如moduleBar)在别的模块中引入。(没有规范的命名)
3.1.2. commonJS规范(node中的规范)
- cjs中导出变量:exports、module.exports
源码中将 module.exports = exports - cjs中导入变量:require
导入模块中本质上找的是module.exports指向的对象
加载过程是同步的,有缓存(文件加载完才往下执行代码)
require的文件查找规则:
1.先在node核心模块中查找(如 path,fs等)
2.本地查找 (./abc 、 …/a 等)
3.无后缀名(查找 文件夹、.js 、 .json、.node) 缺点: 因为cjs的require函数是同步加载js模块的所以在浏览器中会阻塞代码的执行(所以浏览器中一般采用esModule)
----- cjs的基本使用----
//a.js 模块(导出)
//node中将module.exports = exports并且在最顶层
const name = "xiaomi"
const age = 20
function say(){
console.log('你好呀!')
}
//将要导出的内容挂载到exports对象上(刚开始exports为一个空对象)
exports.name = name
exports.age = age
exports.say = say
//b.js 模块(导入)
const objI = require('a.js')
//相当于require('a.js')为导出的module.exports对象
//objI = module.exports
//使用导出的对象属性,方法等
console.log(objI.name) // "xiaomi"
console.log(objI.age) // 20
objI.say() // "你好呀!"
3.1.3. ES module
- ES module中采用export 、export default导出(一个模块只能由一个)
- ES module中采用import 导入
注意:采用ES module 会自动开启严格模式
----- cjs的基本使用----
- 1.1.在index.html中引入js文件时加上type = module
//index.html
<script src="./index.js" type="module"></script>
- 1.2.在bar.js中导出对应模块
//bar.js
const name = "why";
const age = 18;
const sayHello = function(name) {
console.log("你好" + name);
}
//方式一:逐个导出
export const name = "why";
export const age = 18;
export const sayHello = function(name) {
console.log("你好" + name);
}
//方式二: {}中统一导出变量
//(注意此处导出的大括号不是对象(写键值对会报错),而是es moduel的一种语法,保存的是变量引用列表)
export {
name,
age,
sayHellow
}
//方式三:给变量取别名导出
export {
name as Mname,
age as Mage,
sayHellow as MsayHellow
}
//无名导出
export default function (a,b){
return a + b
}
- 1.3.在index.js中导入对应模块
//方式一: import {} from '路径';
import {name,age,sayHellow} from './bar.js'
// 方式二: 导出变量之后可以起别名
import { name as Mname, age as Mage, sayHello as MsayHello } from './bar.js';
// 方式三: * as foo (导出所有变量存放在foo对象中)
import * as foo from './bar.js';
//export default方式导出的 无名导入
import add from './bar.js'
add(1,2)
//import 函数
let flag = true
if(flag){
import('./bar.js').then(res=>{
console.log(res)
}).catch(err=>{
console.log(err)
})
}
总结:commonJS和ES module对比
- cjs 是运行时加载require是一个函数,ES module是编译时解析更快的确定模块之间的关系。
- cjs是require函数同步加载会阻塞后续代码执行,ES module中的import函数异步加载不会阻塞代码执行