[模块]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 / export 与 require 的区别主要体现在以下几个方面:
import/export是 ES6 的模块化语法,而require是 Node.js 的模块化语法import/export是静态的,只能在模块的顶层使用,而require是动态的,可以在任何地方使用import/export可以导出多个变量、函数等,而require只能导出一个对象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的导入方式,此时 :
- package.json 文件中 type:commonjs,表明使用CJS规范
- 报错文件使用js后缀,将默认遵循package.json设定的规范
- 报错文件中使用了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 版本号 版本回退到指定版本࿰…...
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的折扣活动怎么分类? 满减活动:满减活动是虾皮常见的一种折扣形式。在这种活动中࿰…...
磁盘空间占用巨大的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元素来实现。 例如: <exec executable"${browser}" spawn"true"><arg value"${file}"/> </exec>arg元素的部分属性说明: val…...
STM32G0+EMW3080+阿里云飞燕平台实现单片机WiFi智能联网功能(三)STM32G0控制EMW3080实现IoT功能
项目描述:该系列记录了STM32G0EMW3080实现单片机智能联网功能项目的从零开始一步步的实现过程;硬件环境:单片机为STM32G030C8T6;物联网模块为EMW3080V2-P;网联网模块的开发板为MXKit开发套件,具体型号为XCH…...
IntelliJ IDEA - Git Commit 后 Commit 窗口不消失解决方案
这个现象是在 2023 年版本后开始的,一开始以为是 Mac 系统的原因,后来发现原来 Windows 也这样,所以应该只跟 IDEA 版本有关 可以看到左侧 commit 后,这个侧边栏还在,按理讲在以前的版本是之前消失,这样使…...
Vue 组件化编程 和 生命周期
目录 一、组件化编程 1.基本介绍 : 2.原理示意图 : 3.全局组件示例 : 4.局部组件示例 : 5.全局组件和局部组件的区别 : 二、生命周期 1.基本介绍 : 2.生命周期示意图 : 3.实例测试 : 一、组件化编程 1.基本介绍 : (1) 开发大型应用的时候,页面往往划分成…...
《数字图像处理-OpenCV/Python》连载(41)图像的旋转
《数字图像处理-OpenCV/Python》连载(41)图像的旋转 本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏: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账号,以及提交忽略部分文件
目录 编辑 一:前言 二:解决方法 三:提交gitee时忽略文件 一:前言 在开发中,我们拥有不止一个 gitee 账号,通常而言一个是公司的,一个是私人的。有时候我们在公司写了一些自己的东西&#…...
解析邮件文本内容; Mime文本解析; MimeStreamParser; multipart解析
原始文本 ------_Part_46705_715015081.1699589700255 Content-Type: text/html;charsetUTF-8 Content-Transfer-Encoding: base64PGh0bWwCiAgICA8aGVhZD4KICAgICAgICA8bWV0YSBodHRwLW VxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRt bDsgY2hhcnNldD1VVEYtOCICiAgICAgIC…...
获取请求IP以及IP解析成省份
某些业务需要获取请求IP以及将IP解析成省份之类的,于是我写了一个工具类,可以直接COPY /*** IP工具类* author xxl* since 2023/11/9*/ Slf4j public class IPUtils {/*** 过滤本地地址*/public static final String LOCAL_ADDRESS "127.0.0.1&quo…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
