美文网首页
CommonJS与EsModule

CommonJS与EsModule

作者: 香蕉不拿呢 | 来源:发表于2021-12-17 10:45 被阅读0次

javascript模块化编程
模块化可以更方便地使用别人的代码,想要什么功能,就加载什么模块。
目前流行Javascript模块规范有两种:CommonJS,EsModule

1.区别
1.1 语法

CommonJS模块使用require()引入模块,使用module.exports导出模块
EsModule模块使用import引入模块,使用export导出模块

// CommonJs -------
// 引入模块
var path = require("path")
// 导出模块
const path = ()=>{}
module.exports = path

// EsModule ----------
// 引入模块
import path from "path"
import { doSomeThing } from "path"
// 导出模块
export const doSomeThing = ()=>{}
export default path
1.2 用法

require()同步加载模块,js是单线程,会阻塞加载
import是异步加载模块

node.js使用的是CommonJS模块规范。
浏览器使用的是EsModule模块异步加载,因为如果使用CommonJS同步加载资源时会有卡顿现象。

1.3 值

CommonJS是基于值的拷贝
EsModule是基于值的引用

2.node.js环境

node.js环境中,.js后缀的文件默认使用的是CommonJS模块,如果想要使用ES6模块需要采用.mjs后缀的文件名。
如果想要不修改文件后缀名,但是又使用ES6模块,可以编辑项目的根目录package.json文件

{
    "type":"module"
}

修改package.json文件后,.js脚本文件就会使用ES6模块解析
如果修改package.json的同时想要使用CommonJS模块,需要将相应脚本文件后缀改成.cjs

3.两种模式互相加载
3.1 CommonJS模块加载EsModule模块

直接使用CommonJs的require加载EsModule模块会报错
因为CommonJS是同步加载,可以使用async与await实现同步

// 使用匿名函数闭包
(async()=>{
    await import('./test.mjs')
})()
3.2 EsModule加载CommonJs模块

EsModule可以使用import命令加载CommonJS,
但是因为CommonJs导出是使用module.export导出整个模块对象,不能直接输出单一项
如果想要输出单一项,可以使用对象的解构赋值
test.cjs文件

const method1 = ()=>{}
const method2 = ()=>{}
module.exports = {
    method1,
    method2
}
import Test from "./test.cjs"
//对象解构赋值
const { method1,method2 } from Test

// 会报错
import { method1,method2 } from './test.cjs'
3.3 同时兼容加载两种格式
3.3.1 原始模块是CommonJS

嵌套一层,包装成esmodule模块

import Test from "./test.cjs"
export const method1 = Test.method1
export const method2 = Test.method2
export default Test
3.3.2 原始模块是EsModule

提供一个统一输出接口export default
CommonJS使用import()引入

相关文章

  • CommonJS与EsModule

    javascript模块化编程模块化可以更方便地使用别人的代码,想要什么功能,就加载什么模块。目前流行Javasc...

  • Webpack基础打包(一)

    1. webpack介绍 commonjs和esmodule不是随随便便就可以用的 esmodule在一些特殊的浏...

  • 关于webpack常见的题目

    1. webpack中的Module指的是什么? webpack支持ESModule, CommonJS, AMD...

  • ESModule

    模块化解决的问题 命名冲突(命名空间来解决)采用自执行函数的方式 (解决代码的高内聚 低耦合问题) 模块的几种规范...

  • webpack and react-router按需加载

    原理:CommonJS与import() 方法一:CommonJS模块语法 利用require.ensure,re...

  • esmodule规范

    模块化解决的问题:命名冲突(命名空间来解决)采用自执行函数的方式 (解决代码的高内聚 低耦合问题) 模块的几种规范...

  • Commonjs规范

    CommonJS和AMD CommonJS Nodejs的模块系统就采用CommonJS模式。CommonJS标准...

  • CommonJs 与 ESM

    ES Modules 特性 自动采用严格模式,忽略 'user strict' 每个 ES Module 都是运行...

  • 无标题文章

    node模块与包管理 在Node中,使用的是Commonjs模块标准,commonjs模块系统是文件之间共享对象或...

  • module.exports与exports,export与ex

    module.exports与exports,export与export default分属于CommonJS模块...

网友评论

      本文标题:CommonJS与EsModule

      本文链接:https://www.haomeiwen.com/subject/owfifrtx.html