node.js 第四天 模块化CommonJs

本文详细介绍了Node.js中的模块化,包括CommonJS的exports、module.exports和require,以及ES模块的export、export default。还讨论了核心模块中的process对象及其在处理进程中的角色,如process.exit()和process.nextTick()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CommonJS

通过exports暴露出去,require获取暴露的内容

exports

exports一个一个暴露出去
文件01.js

exports.a='孙悟空';
exports.b ={name:'白骨精'}
exports.c =function fn(){
    console.log("hello")
} 

文件02.js
require中的路径必须是 ./ 或 ../ 开头,里边的.js扩展名可以省略,如果省略了扩展名,nodejs可以为我们补全,优先找js文件,找不到找json文件

const m =require('./01.js')
console.log(m)
m.c()
module.exports

通过 module.exports同事导出多个值

module.exports ={
    a:'孙悟空',
    b:[1,2,30],
    c:()=>{
        console.log('xixi')
    }
}
const m =require('./01.js')
console.log(m)    //孙悟空
m.c()      //xixi

默认情况下,Node.js会将以下内容视为CommonJS模块:

  1. 使用.cjs为扩展名的文件
  2. 当前的package.json的type属性为commonjs时,扩展名为.js的文件
  3. 当前的package.json不包含type属性时,扩展名为.js的文件
    文件夹作为模块

模块的包装
每一个CommonJS模块在执行时,外层都会被套上一个函数:

(function(exports, require, module, __filename, __dirname) {
// 模块代码会被放到这里
});

所以我们之所以能在CommonJS模块中使用exports、require并不是因为它们是全局变量。它们实际上以参数(实参)的形式传递进模块的。

exports,用来设置模块向外部暴露的内容

require,用来引入模块的方法

module,当前模块的引用

__filename,模块的路径

__dirname,模块所在目录的路径,即当前文件所在的文件夹路径

ES模块

export

默认情况下,node只的模块化标准是 CommonJS
要想使用ES的模块化,可以使用以下两种方法

  1. 使用 .mjs作为扩展名
  2. 在package.json中设置 type:"module" , 当前项目下所有的js文件都变成ES模块, type 默认是 CommonJS

新建一个03.mjs 这里扩展是 .mjs,如果不是ES模块就会报错

export let a =10;
export const b={name:"孙悟空"}

新建一个04.mjs

import {a as A ,  b} from './03.mjs'   # as 换个别名,这里默认的名字不能乱写,与前面暴露的名字要一致
console.log(A,b)
export default

一个模块只能有一个默认导出,默认导出的命名可以随意

export let a =10;
export default function sum(a,b){
    return a+b
}

默认导出可以随意命名

import x ,{a} from './03.mjs'
console.log(x,a)    

默认导出的是值,不能是语句

export default let a =10;   错误

let a= 10;
export default a   对的

导入的内容都是常量导入的内容跟前面定义的没关系,只要是导入的都是常量,常量并不影响对象的修改

export let a =10;
export const b={name:"孙悟空"}
import {a,b} from './03.mjs'
console.log(a)
a =20   #报错  这里不能给常量修改值

b.name ="ddd"
console.log(b)   #对的  

ES模块化在浏览器中可以使用,但是通常我们不会使用,因为要考虑兼容性的问题,通常结合打包工具使用

核心 模块

window是浏览器的宿主对象,node没有
global是node的全局对象 ,作用类似于window
在ES模块下,都可以共 globalThis

process

表示当前的node进程
通过该对象可以获取进程的信息,或者对进程做各种操作
process.exit([code]) 结束进程
process.nextTick(callback[, …args]) 向tick任务队列中添加任务
process.nextTick 跟queueMicrotask 都是微任务队列中添加任务

queueMicrotask(()=>{
    console.log(1)
})
process.nextTick(()=>{
    console.log(2)
})
 //  2   1

调用栈 -》tick队列-》微任务队列-》宏任务队列

所以queueMicrotask 在tick后面执行,不需要了解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值