当前位置: 首页 > news >正文

[模块]ES6与cjs的混合开发

[模块]ES6与cjs的混合开发

  • 模块语言
  • 混合开发的原因
  • Nodejs中使用ES6
    • 关于动态加载的讲解
  • 项目的模块语言
  • CJS 与 ESM 开发
    • 模块的使用方法
      • 普通模块引入
      • json 文件的引入
      • 普通模块导出
    • CJS兼容ESM
    • ESM兼容CJS(推荐)
    • 全局变量--dirname-filename-esm库
  • 问题
    • Error: EPERM: operation not permitted, rename
    • SyntaxError: Cannot use import statement outside a module
    • Error: Cannot find module 'D:\serverjs\index'

模块语言

现有的模块化开发语言主要包括:

  • CJS(CommonJS):同步的模块化规范
  • ESM-是 JavaScript 语言层面的模块规范,目标是取代其它所有模块化开发规范,成为前端领域的标准模块规范

因为 ESM 是下一代的标准,所以开发的时候尽量使用ESM

混合开发的原因

因为最早使用的CJS(CommonJS)规范开发,后来随着ES6规范的开始,大部分的库陆续转化成ES6的规范,但是部分仍旧是使用的CJS的规范,在一个ESM的项目中使用了CJS的模块,就导致了项目的混合开发

Nodejs中使用ES6

在 Node.js 中使用 ES6 的 import / exportrequire 的区别主要体现在以下几个方面:

  1. import / export 是 ES6 的模块化语法,而 require 是 Node.js 的模块化语法
  2. import / export 是静态的,只能在模块的顶层使用,而 require 是动态的,可以在任何地方使用
  3. import / export 可以导出多个变量、函数等,而 require 只能导出一个对象
  4. import / export 是异步加载模块,而 require 是同步加载模块

总的来说,如果你使用的是 ES6 的语法,建议使用 import / export ,否则使用 require ,但是如上所说ESM 是下一代的标准,所以逐渐的nodejs使用ES6的方式越来越方便

关于动态加载的讲解

地址

项目的模块语言

package.json 中的 type 字段用来指定项目的类型,默认为commonjs。type的取值包括:

  • commonjs: 表示该包是一个 CommonJS 模块(即 Node.js 默认的模块格式)
  • module: 表示该包是一个 ES 模块(即标准的 ECMAScript 模块格式)
  • json: 表示该包仅包含 JSON 数据,可以通过 require() 函数或 ES6 的 import 语句来导入

在项目中,不同文件的后缀表明:
.cjs是使用CommonJS规范
.mjs是使用ES规范
.js则以package.json中的type字段为准

所以可以通过以上不同的文件后缀来实现项目的混合开发

CJS 与 ESM 开发

CJS 与 ESM规范在使用上有非常多的不同之处,下面是本人一个CJS的项目升级到ESM规范的过程中遇到的各种问题

模块的使用方法

CJS通过require引入,module.exports导出;

ESM通过import引入,export导出;

普通模块引入

const path = require("path");//CJS
import path from "path";//ESJ

json 文件的引入

const pkg = require("../package"); //CJS 获取package.json的数据import pkg from "../package.json" assert { type: "json" };//ESJ

import是不可以直接引入json文件的

普通模块导出

module.exports = upgrade;//cjs
export default upgrade;//esj

CJS兼容ESM

(async function() {const esm = await import('esm');esm.a();esm.b();
})();

ESM兼容CJS(推荐)

ESM可以直接 importCJS 模块,越来越多的库使用ESM,建议新项目优先使用ESM规范。

import { a, b } from 'cjs';
a();
b():
//或者
import a from 'cjs';
a()

全局变量–dirname-filename-esm库

ESM中没有注入__dirname、__filename全局变量,可以通过dirname-filename-esm库获取

__dirname:执行命令的文件所在目录的绝对路径(不包含当前文件名)
__filename:当前文件的绝对路径(包含文件名)

import { dirname } from 'dirname-filename-esm'// 拿到执行命令文件所在目录的绝对路径
const __dirname = dirname(import.meta)
console.log(__dirname)import { filename } from 'dirname-filename-esm'
// 获取文件绝对路径
const __filename = filename(import.meta)// 如果不引入库dirname-filename-esm 可以通过以下方式
// import { fileURLToPath } from 'node:url'
// const __filename = fileURLToPath(import.meta.url)

问题

Error: EPERM: operation not permitted, rename

请检查当前命令是不是在编辑器中执行,要修改的文件夹是不是在编辑器中被打开;如果被打开,请关闭编辑器,在cmd等终端的对应项目目录下执行

请检查当前命令执行的命令,是否已经存在将要被修改成的名称的文件夹或文件,导致了命名冲突的问题;如果已经存在,修改新的命名,或者删除已经存在的命名

SyntaxError: Cannot use import statement outside a module

该问题就是在cjs规范的项目中使用了import的导入方式,此时 :

  1. package.json 文件中 type:commonjs,表明使用CJS规范
  2. 报错文件使用js后缀,将默认遵循package.json设定的规范
  3. 报错文件中使用了ESM的规范

解决方案是,将报错文件的后缀改为mjs,表明当前文件使用ESM规范

Error: Cannot find module ‘D:\serverjs\index’

该问题是在package中script中定义的某个命令test运行导致的:

{"script":{"test" :"node  ./serverjs/index"}
}

运行后报错:
`
node:internal/modules/cjs/loader:936
throw err;

Error: Cannot find module ‘D:\serverjs\index’
`
然后找到该文件确实存在,但是后缀名是".mjs",所以命令无法自动识别后缀非js文件,需要在命令中明确后缀名

node ./serverjs/lowdb/bin/index.mjs

问题解决!!!

相关文章:

[模块]ES6与cjs的混合开发

[模块]ES6与cjs的混合开发 模块语言混合开发的原因Nodejs中使用ES6关于动态加载的讲解 项目的模块语言CJS 与 ESM 开发模块的使用方法普通模块引入json 文件的引入普通模块导出 CJS兼容ESMESM兼容CJS(推荐)全局变量--dirname-filename-esm库 问题Error: EPERM: operation not p…...

git上传项目至github(Linux)

01 git版本创建 git init 创建版本库 创建一个版本 git add test1.cpp git commit -m 说明信息 git log 查看版本记录 02 版本回退 git reset --hard HEAD^ 版本回退一个 git reset --hard HEAD^^ 版本回退二个 git reset --hard 版本号 版本回退到指定版本&#xff0…...

SSH 远程登录 WSL

更新ssh设置 sudo apt-get update sudo apt-get remove openssh-server sudo apt-get install openssh-server 编辑网络配置 sudo vi /etc/ssh/sshd_config (1)修改ssh服务监听端口和监听地址 注意:为了个人的安全,还是建议换…...

每天一道算法题:40. 组合总和 II

难度 中等 题目 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1: 输入: candidat…...

Centos7安装PostgreSQL 14

环境: Centos7安装PostgreSQL_14版本数据库; 打开官方网站:PostgreSQL: Linux downloads (Red Hat family) 一、 版本选择 复制、粘贴并运行如下脚本: 二、安装步骤 这些命令是在 CentOS 7.x 系统上安装和配置 PostgreSQL 14 的步…...

Shopee的折扣活动怎么分类?shopee设置折扣注意事项

旺季到来,Shopee会举办一些折扣活动来吸引客户,那么shopee的折扣活动怎么分类,shopee设置折扣注意事项? shopee的折扣活动怎么分类? 满减活动:满减活动是虾皮常见的一种折扣形式。在这种活动中&#xff0…...

磁盘空间占用巨大的meta.db-wal文件缓存(tracker-miner-fs索引服务)彻底清除办法

磁盘命令参考本博客linux磁盘空间满了怎么办. 问题: 磁盘空间被盗 今天瞄了一下我的Ubuntu系统盘, nftdiggernftdigger-Ubuntu:~$ df -h 文件系统 容量 已用 可用 已用% 挂载点 udev 16G 0 16G 0% /dev tmpfs 3.2G 1.9…...

力扣:160. 相交链表(Python3)

题目: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,…...

【华为OD机试AB高分必刷题目】无名的搜索题(Java-优先搜索(DFS)实现)

🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,高质量解题代码,详细代码讲解,助你深入学习,高分通过! 文章目录 【华为OD机试AB高分必刷题目】无名的搜索题(Java-优先搜索(DFS)实现)题目描述解题思路Java题解代码代码OJ评判结果代码讲解寄语【华为OD机…...

ant 任务(task)通过内嵌的arg元素传递命令行参数

有的ant 任务将参数传递给其它的进程作为命令行参数。这可以通过内嵌的arg元素来实现。 例如&#xff1a; <exec executable"${browser}" spawn"true"><arg value"${file}"/> </exec>arg元素的部分属性说明&#xff1a; val…...

STM32G0+EMW3080+阿里云飞燕平台实现单片机WiFi智能联网功能(三)STM32G0控制EMW3080实现IoT功能

项目描述&#xff1a;该系列记录了STM32G0EMW3080实现单片机智能联网功能项目的从零开始一步步的实现过程&#xff1b;硬件环境&#xff1a;单片机为STM32G030C8T6&#xff1b;物联网模块为EMW3080V2-P&#xff1b;网联网模块的开发板为MXKit开发套件&#xff0c;具体型号为XCH…...

IntelliJ IDEA - Git Commit 后 Commit 窗口不消失解决方案

这个现象是在 2023 年版本后开始的&#xff0c;一开始以为是 Mac 系统的原因&#xff0c;后来发现原来 Windows 也这样&#xff0c;所以应该只跟 IDEA 版本有关 可以看到左侧 commit 后&#xff0c;这个侧边栏还在&#xff0c;按理讲在以前的版本是之前消失&#xff0c;这样使…...

Vue 组件化编程 和 生命周期

目录 一、组件化编程 1.基本介绍 : 2.原理示意图 : 3.全局组件示例 : 4.局部组件示例 : 5.全局组件和局部组件的区别 : 二、生命周期 1.基本介绍 : 2.生命周期示意图 : 3.实例测试 : 一、组件化编程 1.基本介绍 : (1) 开发大型应用的时候&#xff0c;页面往往划分成…...

《数字图像处理-OpenCV/Python》连载(41)图像的旋转

《数字图像处理-OpenCV/Python》连载&#xff08;41&#xff09;图像的旋转 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第 6 章 图像的几何变换 几何变换分…...

案例 - 拖拽上传文件,生成缩略图

直接看效果 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>拖拽上传文件</title>&l…...

PHP 使用递归方式 将其二维数组整合为层级树 其中层级id 为一个uuid的格式 造成的诡异问题 已解决

不啰嗦 直接上源代码 <?php function findChildren($list, $p_id){$r array();foreach ($list as $k > $item) {if ($item[fid] $p_id) {unset($list[$k]);$length count($r);$r[$length] $item;if ($t findChildren($list, $item[id])) {$r[$length][children] …...

rv1126-rv1109-添加分区,定制固件,开机挂载功能

===================================================================== 修改分区: 这里是分区的txt文件选择; 这里是分区的划分,我这里回车了,方便看 FIRMWARE_VER: 8.1 MACHINE_MODEL: RV1126 MACHINE_ID: 007 MANUFACTURER: RV1126 MAGIC: 0x5041524B ATAG: 0x00200…...

一台电脑使用多个gitee账号,以及提交忽略部分文件

目录 ​编辑 一&#xff1a;前言 二&#xff1a;解决方法 三&#xff1a;提交gitee时忽略文件 一&#xff1a;前言 在开发中&#xff0c;我们拥有不止一个 gitee 账号&#xff0c;通常而言一个是公司的&#xff0c;一个是私人的。有时候我们在公司写了一些自己的东西&#…...

解析邮件文本内容; Mime文本解析; MimeStreamParser; multipart解析

原始文本 ------_Part_46705_715015081.1699589700255 Content-Type: text/html;charsetUTF-8 Content-Transfer-Encoding: base64PGh0bWwCiAgICA8aGVhZD4KICAgICAgICA8bWV0YSBodHRwLW VxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRt bDsgY2hhcnNldD1VVEYtOCICiAgICAgIC…...

获取请求IP以及IP解析成省份

某些业务需要获取请求IP以及将IP解析成省份之类的&#xff0c;于是我写了一个工具类&#xff0c;可以直接COPY /*** IP工具类* author xxl* since 2023/11/9*/ Slf4j public class IPUtils {/*** 过滤本地地址*/public static final String LOCAL_ADDRESS "127.0.0.1&quo…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...