网上智慧团建系统入口/seo优化网站技术排名百度推广

网上智慧团建系统入口,seo优化网站技术排名百度推广,卖东西的平台有哪些,多用户商城(c2c)网站制作方案Node.js 模块系统:CommonJS 和 ES Modules 核心差异与实战指南 一、模块系统基础概念 **CommonJS (CJS)**​ 是 Node.js 传统模块系统,采用同步加载方式,典型特征: // 导出 module.exports { name: cjs }; // 或 exports.nam…

Node.js 模块系统:CommonJS 和 ES Modules 核心差异与实战指南

一、模块系统基础概念

**CommonJS (CJS)**​ 是 Node.js 传统模块系统,采用同步加载方式,典型特征:

// 导出
module.exports = { name: 'cjs' };  // 或 exports.name = 'cjs'// 导入
const moduleA = require('./moduleA');  // 动态语法

**ES Modules (ESM)**​ 是 ECMAScript 标准模块系统,采用异步加载,典型特征:

// 导出
export const name = 'esm';  // 命名导出
export default { version: 1 };  // 默认导出// 导入
import moduleB, { name } from './moduleB.mjs';  // 静态语法
二、7 个关键差异点(附代码验证)
1. 语法与加载机制
  • CJS 动态加载:允许条件语句中 require
if (Math.random() > 0.5) {require('./moduleA');  // 运行时决定加载
}
  • ESM 静态分析:import 必须顶层声明
// 报错:import 必须位于模块顶部
if (condition) { import './moduleB.mjs' } 
2. 模块作用域差异
  • CJS 非严格模式:变量可隐式创建全局变量
// module-cjs.js
undeclaredVar = 100;  // 不报错,污染全局
  • ESM 严格模式:禁止隐式全局变量
// module-esm.mjs
undeclaredVar = 100; // 报错:未定义变量
3. 循环引用处理
  • CJS 动态引用:可能拿到未初始化的模块
// a.js
exports.loaded = false;
const b = require('./b');
console.log('在a中,b.loaded =', b.loaded);  // true
exports.loaded = true;// b.js
exports.loaded = false;
const a = require('./a');
console.log('在b中,a.loaded =', a.loaded);  // false
exports.loaded = true;// 执行 node a.js → 输出顺序:
// 在b中,a.loaded = false
// 在a中,b.loaded = true
  • ESM 静态绑定:引用指向最新值(类似指针)
// a.mjs
import { loaded } from './b.mjs';
export let loaded = false;
console.log('在a中,b.loaded =', loaded);  // true
loaded = true;// b.mjs
import { loaded } from './a.mjs';
export let loaded = false;
console.log('在b中,a.loaded =', loaded);  // false
loaded = true;// 执行 node a.mjs → 报错(循环引用需特殊处理)
4. 顶层 this 指向
  • CJS 的 this​ 指向 module.exports 对象
console.log(this === module.exports);  // true
  • ESM 的 this​ 为 undefined(严格模式)
console.log(this);  // undefined
5. 文件扩展名与配置
  • CJS​ 默认识别 .js 和 .cjs 文件
  • ESM​ 需要以下条件之一:
    • 文件后缀为 .mjs
    • 最近的 package.json 中设置 "type": "module"
// package.json
{"type": "module"  // 项目内 .js 文件默认视为 ESM
}
6. 引用类型差异
  • CJS 导出值拷贝:基本类型值复制,对象类型浅拷贝
// cjs-module.js
let count = 1;
setTimeout(() => { count = 2 }, 100);
module.exports = { count };// main.js
const { count } = require('./cjs-module');
console.log(count);  // 1
setTimeout(() => console.log(count), 200);  // 仍为1
  • ESM 动态绑定:始终获取最新值
// esm-module.mjs
export let count = 1;
setTimeout(() => { count = 2 }, 100);// main.mjs
import { count } from './esm-module.mjs';
console.log(count);  // 1
setTimeout(() => console.log(count), 200);  // 变为2
7. 动态导入能力
  • CJS​ 原生不支持动态导入,但可通过 require 实现
  • ESM​ 支持 import() 动态导入(返回 Promise)
// 动态加载 ESM 模块
const module = await import('./module.mjs');// 动态加载 CJS 模块(在 ESM 中)
import cjsModule from './cjs-module.cjs';  // 需完整后缀

三、日常开发建议
1. 新项目技术选型
  • 优先使用 ESM:符合语言标准,支持 Tree Shaking
// package.json
{"type": "module","scripts": {"start": "node --experimental-vm-modules src/index.mjs"}
}
2. 旧项目迁移策略
  • 渐进式迁移
    • 将单个文件后缀改为 .mjs 或设置 "type": "module"
    • 使用 import/export 语法逐步替换
// 混合使用示例(在 ESM 中引入 CJS)
import cjsModule from './legacy-module.cjs';  // 注意后缀
3. 模块兼容性处理
  • 双格式发布库:通过 package.json 指定双入口
{"exports": {"import": "./esm-module.mjs","require": "./cjs-module.cjs"}
}
4. 避免踩坑指南
  • 禁用默认互操作:CJS 默认导出需特别注意
// ESM 导入 CJS 模块
import cjsModule from './cjs-module.cjs';  // module.exports 整体作为默认导出
  • 循环引用处理:ESM 中建议使用函数封装初始化逻辑
// a.mjs
import { initB } from './b.mjs';
export let valueA = '未初始化';export function initA() {valueA = '初始化A';initB();
}// b.mjs
import { initA } from './a.mjs';
export let valueB = '未初始化';export function initB() {valueB = '初始化B';initA();  // 安全调用
}

四、注意事项
  1. 全局变量替换
    ESM 中无法直接使用 __dirname,需改用:

    import { fileURLToPath } from 'url';
    const __dirname = path.dirname(fileURLToPath(import.meta.url));
  2. 文件扩展名强制要求
    在 ESM 中引入文件时必须写完整扩展名:

    import './utils.js';  // 必须写 .js
  3. 默认导出差异
    CJS 的 module.exports 对应 ESM 的默认导出:

    // CJS 模块
    module.exports = { a: 1 };// ESM 导入方式
    import cjsModule from './cjs-module.cjs';  // { a: 1 }
  4. 性能优化
    ESM 的静态分析特性使打包工具(如 Rollup)能实现更高效的 Tree Shaking。


五、总结

理解两种模块系统的核心差异,能帮助开发者根据场景合理选择:

  • CJS​ 适合传统 Node.js 项目、需要动态加载的场景
  • ESM​ 适合现代浏览器兼容项目、需要静态分析的构建优化

在混合项目中,通过文件扩展名和 package.json 配置明确模块类型,避免隐式错误。对于长期维护的项目,逐步向 ESM 迁移是更符合技术趋势的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wav格式的音频压缩,WAV 转 MP3 VBR 体积缩减比为 13.5%、多个 MP3 格式音频合并为一个、文件夹存在则删除重建,不存在则直接建立

🥇 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 🎉 声明: 作为全网 AI 领域 干货最多的博主之一,❤️ 不负光阴不负卿 ❤️ 文章目录 问题一:wav格式的音频压缩为哪些格式,网络传输给用户播放…

赋能农业数字化转型 雏森科技助力“聚农拼”平台建设

赋能农业数字化转型,雏森科技助力“聚农拼”平台建设 在数字化浪潮席卷各行业的今天,农业领域也在积极探索转型升级之路。中农集团一直以“根植大地,服务三农”为核心,以“乡村振兴,农民增收”为目标,及时…

千峰React:Hooks(上)

什么是Hooks ref引用值 普通变量的改变一般是不好触发函数组件的渲染的,如果想让一般的数据也可以得到状态的保存,可以使用ref import { useState ,useRef} from reactfunction App() {const [count, setCount] useState(0)let num useRef(0)const h…

Ubuntu20.04安装Redis

1.切换到root用户 如果没有切换到root用户的,切换到root用户。 2.使用 apt install redis 安装redis 遇到y/n直接y即可。 redis安装好之后就自动启动起来了,因此我们可以通过netstat -anp | grep redis命令来查看是否安装成功。 6379是Redis的默认端…

游戏引擎学习第124天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾/复习 今天是继续完善和调试多线程的任务队列。之前的几天,我们已经介绍了多线程的一些基础知识,包括如何创建工作队列以及如何在线程中处理任务。今天,重点是解决那些我们之前没有注意到…

在MacOS上打造本地部署的大模型知识库(一)

一、在MacOS上安装Ollama docker run -d -p 3000:8080 --add-hosthost.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main 最后停掉Docker的ollama,就能在webui中加载llama模…

(八)Java-Collection

一、Collection接口 1.特点 Collection实现子类可以存放多个元素,每个元素可以是Object; 有些Collection的实现类,可以存放重复的元素,有些不可以; 有些Collection的实现类,有些是有序的(Li…

大模型RAG(检索增强)创新--SELF-RAG

检索增强生成 (RAG) 提供了一种将 ChatGPT/GPT-4 等大型语言模型与自定义数据集成的途径,但存在局限性。让我们看看 RAG 最近的研究是如何解决一些问题。 大语言模型(LLM)将改变整个金融领域。其中一个场景是大语言模型可以学习大量文档,并在很短的时间内…

11特殊函数

一、递归函数 递归概念:如果一个函数内部,包含了对自身的调用,则该函数称为递归函数。要点: 只有能被表达为递归的问题,才能用递归函数解决。递归函数必须有一个可直接退出的条件,否则会进入无限递归。递归…

鸿蒙 ArkUI 实现敲木鱼小游戏

敲木鱼是一款具有禅意的趣味小游戏,本文将通过鸿蒙 ArkUI 框架的实现代码,逐步解析其核心技术点,包括动画驱动、状态管理、音效震动反馈等。 一、架构设计与工程搭建 1.1 项目结构解析 完整项目包含以下核心模块: ├── entry…

神经性肺纤维的预防方法

神经性肺纤维的预防方法 一、引言 神经性肺纤维化是一种慢性进行性肺部疾病,其病因复杂,包括遗传、环境等多种因素。该病不仅影响患者的呼吸功能,还可能对神经系统造成损害。因此,预防神经性肺纤维化显得尤为重要。本文将详细介…

azure sql 网络安全组 网络安全sql注入

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 SQL注入 1、原理 针对注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序意料之外结果的攻击行为。 其…

利用node.js搭配express框架写后端接口(一)

Node.js 凭借其高效的非阻塞 I/O 操作、事件驱动架构以及轻量级的特点,成为了开发高性能服务器应用的热门选择。Express 框架作为 Node.js 上最流行的 Web 应用框架之一,以其简洁的 API 和丰富的中间件生态系统,极大地简化了 Web 后端开发流程…

【小白数学】为什么可以用拉格朗日乘子法求函数的极值【二】

我们在上一篇【小白数学】- 为什么可以用拉格朗日乘子法求函数的极值【一】已经介绍了一种较为“严谨“的方法来说明为什么拉格朗日乘子法可以帮助我们求具有等式约束条件下的函数的极值。虽然在我们的例子中”等式约束“中只有一个等式。但其实很容易推广到多个等式约束的情况…

考研出分24小时,人类精神状态图鉴

2月24日,上午10点起,各省考研初试成绩陆续公布,考生们或紧张的输入准考证号,或抱团等待“审判”。然而更魔幻的还在后头——下午4点,教育部竟在同一天直接发布了《2025年研考国家分数线》。 不少网友表示:…

川翔云电脑优势总结

在数字化时代,川翔云电脑依托云计算技术,为用户解决硬件性能瓶颈问题。川翔云电脑使用云渲码:【2355】 卓越硬件配置:配备 RTX 3090、48G 显存的 RTX 4090plus,支持 1 - 8 卡机配置,多卡并行计算能力强&am…

DeepSeek开源周Day4:三连发!突破 AI 训练瓶颈的立体解决方案,并行计算三剑客DualPipe、EPLB与Profile-data

项目地址: https://github.com/deepseek-ai/DualPipehttps://github.com/deepseek-ai/eplbhttps://github.com/deepseek-ai/profile-data 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天 (4/5)! ​ ​ 一、背景概述 …

基于W2605C语音识别合成芯片的智能语音交互闹钟方案-AI对话享受智能生活

随着科技的飞速发展,智能家居产品正逐步渗透到我们的日常生活中,其中智能闹钟作为时间管理的得力助手,也在不断进化。基于W2605C语音识别与语音合成芯片的智能语音交互闹钟,凭借其强大的联网能力、自动校时功能、实时天气获取、以…

Vite与Turbopack现代构建工具架构解析:秒级构建的性能奥秘

引言:传统构建工具的效能瓶颈 Shopify将前端仓库迁移至Vite后,HMR更新时间从Webpack的4.2秒缩短至48毫秒。Turbopack在Vercel生产环境测试中,增量构建速度较Webpack快700%。ChromeOS团队采用Vite后,生产构建从Webpack的17分钟优化…

视频级虚拟试衣技术在淘宝的产品化实践

作为一种新的商品表现形态,内容几乎存在于手淘用户动线全流程,例如信息流种草内容、搜索消费决策内容、详情页种草内容等。通过低成本、高时效的AIGC内容生成能力,能够从供给端缓解内容生产成本高的问题,通过源源不断的低成本供给…