《Vite 基础知识》关于 .mjs .cjs 文件引出 NodeJS 对JS模块加载的思考(CommonJS 和 ESM)

前言

学习 Webpack/Vue2 升级 Vite/Vue3 时,发现以下不同:

  1. 新建的 Vitepress 项目默认创建了 config.mjs 文件;

  2. 新建的 Vite/Vue3 项目,package.json 中默认加上 type: 'module' 配置;

  3. 新建的 Vite/Vue3 项目,postcss.config.cjs 文件后缀必须是 .cjs,否则报错;

其实它们是一个问题,Node.js .js 文件的模块加载方式!

分析

先理清几个概念!!!

Node.js 的模块加载方法有两种:CommonJS ES Modules(ES6/ESM,接下来都用简称 ESM )

CommonJS 和 ESM 区别

功能CommonJSESM
导入/导出接口require()exports/module.exportsimportexport
输出值的拷贝值的引用
动态导入不支持支持
作用域全局作用域局部作用域
加载运行时加载编译时输出接口
同步/异步require() 是同步加载模块import 命令是异步加载模块
循环依赖程序复杂时容易崩溃可处理循环依赖,因为是静态作用域
浏览器兼容支持现代浏览器,旧版不支持更适用于早期 Node.js 环境
Node.js 支持Node.js打包 JS 代码的原始方式v8.5.0(2017.9.12) 开始支持
v13.2.0(2019.11.21) 开始默认支持

值得学习的参考链接

Node.js 指导(暂无中文官网,网上找到的其它中文版本较旧,建议直接看英文最新版):

  • NodeJS CommonJS 和 ESM

  • NodeJS CommonJS 中的 require 和 exports/module.exports 说明;

  • NodeJS ESM 中的 import and export 使用官方语法,推荐中文import 和 export;

  • 关于CommonJSESM 区别说明,推荐中文 《ES6 模块与 CommonJS 模块的差异》;

  • 关于CommonJSESM 互操作性说明;

  • 循环加载 《CommonJS 模块的循环加载》 和 《ES6 模块的循环加载》;

  • Javascript 静态和动态作用域;

package.json 属性 type

package.json 是对 Node.js 项目或 npm 包的描述,里面包含许多元信息。如:项目名称,版本,入口文件,贡献者、依赖插件等。

type 属性值:

  • commonjs(默认):项目中的 .js 文件都作为 CommonJS 模块加载;
  • module:项目中的 .js 文件都作为 ESM 模块加载;
{
    // 默认加载方式,不设置也是 commonjs
	type: 'commonjs',
    
    // ESM 方式加载
    type: 'module',
}

也可混合使用,无论 package.json 中设置哪种 type

// 后缀为 .cjs 都将以 CommonJS 方式加载
import './legacy-file.cjs';

// 后缀为 .cjs 都将以 ESM 方式加载
import 'commonjs-package/src/index.mjs';

值得学习的参考链接

  • CommonJS 模块加载 ES6 模块
  • ES6 模块加载 CommonJS 模块
  • 同时支持两种格式的模块

浏览器加载 ESM 模块

要加入type="module"属性,且默认是 defer,即 DOM 渲染完再执行。

<script type="module" src="./foo.js"></script>
<!-- 等同于 -->
<script type="module" src="./foo.js" defer></script>

最后

解答 前言 提到的3个不同点!

  1. Vitepress 文件 config.mjs

创建 Vitepress 项目时,package.json 文件中默认没有配置属性 typeVite 相关项目默认支持 ESM 加载方式,所以创建了文件 .mjs ,以支持 ESM 加载;

  1. Vite/Vue3 项目 postcss.config.cjs

postcss 使用后缀 .js 报如下错。因为 Vite 官网 明确指出 postcss 配置文件暂不支持 ES6 module,必须明确使用后缀 .cjs 也就是 CommonJS 方式加载。

ReferenceError: module is not defined in ES module scope
  1. Vite/Vue3 项目 package.json 属性 type: 'module'

Vite 以 原生 ESM 方式提供源码,加载 .js文件默认使用 ESM 方式。且注意 Vite 的 CJS Node API 构建已经被废弃,并将在 Vite 6 中移除。

PS

整理上述内容时,不同文档有如下三种叫法,其实是一个东西,请注意!

  • ESM
  • ES Modules
  • ES6 Module

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/419918.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

antvX6 - Vue自定义节点,并实现多种画布操作,拖拽、缩放、连线、双击、检索等等

一、 首先 antv x6 分为两个版本 低版本和高版本 我这里是使用的2.0版本 并且搭配了相关插件 例如&#xff1a;画布的图形变换、地图等 个人推荐 2.0版本&#xff0c;高版本配置多&#xff0c;可使用相关插件多&#xff0c;但是文档描述小&#xff0c;仍在更新&#xff0c; 低…

openGauss学习笔记-231 openGauss性能调优-系统调优-资源负载管理-资源负载管理概述

文章目录 openGauss学习笔记-231 openGauss性能调优-系统调优-资源负载管理-资源负载管理概述231.1 功能描述231.2 相关概念**231.2.1 资源管理****231.2.2 控制组****231.2.3 资源池** openGauss学习笔记-231 openGauss性能调优-系统调优-资源负载管理-资源负载管理概述 231.…

java009 - Java调试debugger

1、debugger概述 程序的调试工具&#xff0c;用于查看追踪程序的执行流程&#xff0c;也可以调试程序。 2、debugger调试流程 2.1 如何加断点 2.2 如何运行加了断点的程序 在代码区域右键---->debugger执行 2.3 看哪里 看console窗口 2.4 点哪里 点step into(F7)这个箭…

异常处理(黑马学习笔记)

当前问题 登录功能和登录校验功能我们都实现了&#xff0c;下面我们学习下今天最后一块技术点&#xff1a;异常处理。首先我们先来看一下系统出现异常之后会发生什么现象&#xff0c;再来介绍异常处理的方案。 我们打开浏览器&#xff0c;访问系统中的新增部门操作&#xff0…

potplayer安装

官网 解压运行即可

小(2)型土石坝安全监测设施配置详解

小(2)型土石坝的安全监测是确保大坝稳定、安全运行的重要环节。为此&#xff0c;合理配置安全监测设施显得尤为重要。以下是对小(2)型土石坝安全监测设施配置的详细介绍。 一、渗流量监测 渗流量是反映大坝安全状况的关键指标之一。为准确监测渗流量&#xff0c;我们采用仪器量…

DC28V270V转AC36V115V航空逆变器

在当今的航空航天电源行业中&#xff0c;DC28V270V转AC36V115V航空逆变器发挥着至关重要的作用。作为一种关键的逆变器电源设备&#xff0c;DC28V270V转AC36V115V航空逆变器不仅在航空领域有着广泛的应用&#xff0c;还在许多其他领域发挥着重要作用。 一、DC28V270V转AC36V11…

C语言 常量

常量是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。 常量可以是任何的基本数据类型&#xff0c;比如整数常量、浮点常量、字符常量&#xff0c;或字符串字面值&#xff0c;也有枚举常量。 常量就像是常规的变量&#xff0c;只不过常量的…

【前端素材】推荐优质在线高端蜂蜜商城电商网页Beejar平台模板(附源码)

一、需求分析 1、系统定义 在线高端蜂蜜商城是指一个专门销售高品质、高端蜂蜜产品的电子商务平台。这种商城致力于向消费者提供各种经过精心挑选、具有高营养价值和健康功效的蜂蜜产品。 2、功能需求 在线高端蜂蜜商城是指一个专门销售高品质、高端蜂蜜产品的电子商务平台…

JOSEF约瑟 FHP-33Q/4跳位、合位、电源监视综合控制继电器 凸出式板前接线 0.1-10S

FHP-33系列跳位、合位、电源监视综合控制继电器系列型号&#xff1a;FHP-33A/1跳位、合位、电源监视综合控制继电器&#xff1b;FHP-33A/2跳位、合位、电源监视综合控制继电器&#xff1b;FHP-33A/3跳位、合位、电源监视综合控制继电器&#xff1b;FHP-33A/4跳位、合位、电源监…

数据迁移方法论

文章目录 一. 什么是数据迁移1. 数据迁移与数据整合2. 数据迁移和数据复制3. 数据迁移的主要类型1. Storage migration2. 数据库迁移3. 应用迁移4. 数据中心迁移5. Business process migration&#xff08;业务流程迁移&#xff09;6. 云迁移 二. 数据迁移方法1.大爆炸式数据迁…

说一说kong日志级别

Kong官网&#xff1a;The Platform Powering the API World | Kong Inc. Kong Gateway&#xff1a;Kong Gateway | Kong Docs Kong Admin API&#xff1a;Admin API - Kong Gateway - v3.4.x | Kong Docs Kong 企业版社区&#xff1a;API Community for Developers and Industr…

Freesia项目目录结构

目录结构 前端目录&#xff1a; &#xff08;目录结构来自layui-vue-admin&#xff09; src文件下 api&#xff08;前端请求后端服务的路由&#xff09;assert&#xff08;一些内置或必要的资源文件&#xff09;layouts&#xff08;全局框架样式组件&#xff09;router&…

OPPO打响AI手机第一枪

明敏 发自 凹非寺 量子位 | 公众号 QbitAI 2024开年&#xff0c;AI趋势依旧高歌猛进。 一边&#xff0c;Sora爆火成为现象级AIGC应用&#xff0c;带动AI再度成为春节后全民热议的第一话题。另一边&#xff0c;手机厂商开始大举All in AI&#xff0c;“放弃传统智能手机”、“…

071:vue+cesium 实现下雨效果

第071个 点击查看专栏目录 本示例的目的是介绍如何在vue+cesium中实现下雨效果,这里使用着色器来实现实例特效。 直接复制下面的 vue+cesium源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共120行)着色代码实现心得:专栏目标示例效果

基于java+springboot动物检疫信息管理系统设计和实现

基于java SSM springboot动物检疫信息管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…

文件基础和文件fd

文章目录 预备知识C语言的文件接口系统调用文件fd 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站。 预备知识 我们平时说文件就是说文件里…

【前端素材】推荐优质在线通用果蔬商城电商网页eStore平台模板(附源码)

一、需求分析 1、系统定义 通用果蔬网站是指专门提供各类果蔬产品展示和销售的在线平台。它将不同种类的新鲜水果、蔬菜、干果、坚果等聚集在一起&#xff0c;为消费者提供方便、快捷的购物渠道。 2、功能需求 通用果蔬网站是指专门提供各类果蔬产品展示和销售的在线平台。…

关键对话_

关键对话 https://www.bilibili.com/video/BV1Vh4y1E7sY 关键对话&#xff0c;是那些让你觉得很艰难&#xff0c;同时又非常重要的谈话 关键对话三个特征 1、对话双方的观点有很大差距&#xff0c; 比如说你和你父母观点差异很大&#xff0c;父母觉得到了一定年龄就该结婚啊…

C++:非静态成员默认初始化

C11之前只有常静态成员变量才能进行默认初始化&#xff0c;其它变量初始化时总要进行繁琐的过程 class A{int a; public:A():a(10){} };C11开始支持非静态成员的默认初始化&#xff0c;默认初始化和初始化参数列表同时初始化一个变量时会使用初始化参数列表&#xff0c;不进行…
最新文章