es6模块化导入导出与commonjs模块化(nodejs导入导出)详解——导出export

博主的桌面工具软件已经正式开发,获取方式:

  • 可以关注我的小程序【中二少年工具箱】获取。(若小程序更新有延迟,或关注小程序后续功能,可先收藏小程序)

  • 通过下载链接

  • 百度网盘:
    链接:https://pan.baidu.com/s/15zDnSoEzJGSZLjpD2FYrMw?pwd=1234 提取码:1234 复制这段内容后打开百度网盘手机App,操作更方便哦

具体已实现功能,参考文章中二少年工具箱简介


正文开始

  • 前言
  • 一、起因
  • 二、两者基础对比
  • 三、commonjs导出
  • 四、es6导出
  • 五、总结


前言

本文主要解释前端两种模块化语法:es6模块化与commonjs模块化,纯前端一般遵循es6模块化,使用import语法导入插件,nodejs遵循commonjs模块化,使用require导入插件。

本文虽长,但读完后,正常情况下,足以应付大部分导入导出场景,使用其他人插件再也不用因为导入导出的语法耗费时间。


一、起因

我的小程序后端采用midwayjs框架(nestjs也不错,个人项目支持一波国产),后端部署到腾讯云上,考虑到个人项目服务器有很大概率会迁移,下一个服务器什么情况不好预估,开发某些功能时就需要考虑时区问题,所以使用插件moment-timezone。

使用插件时,遇到报错,信息如下:Module ‘“F:/myProject/lize-tools-back/node_modules/moment-timezone/index”’ can only be default-imported using the ‘esModuleInterop’ flag

造成这报错的起因是我在导入插件时,使用了es6的默认导入方法,而moment-timezone插件遵循commonjs模块化。插件的源码就不贴了,因为它用了ts导出单个对象的方式,这部分知识点和我们本章要了解的并不想关,我们只需要知道,插件最终会被编译成

module.exports = moment

这是明显的commonjs导出方法。

而我如果使用es6默认导入方法:

import moment from 'moment-timezone'

就会报上面的错。

这错误并不是es6或者nodejs抛出的,因为从Node.js v13.2 版本开始,Node.js 已经默认打开了 ES6 模块支持(这句话抄的阮一峰大神,我没有自己考证)。

上面的错误其实是ts提示的,ts认为commonjs中没有默认导出的概念,默认导出是es6中的概念,所以自然也不能用import默认导入的方式。按照提示配置esModuleInterop,我们可以绕过报错,但是从这个报错,我正好整理了一下es6模块化和commonjs模块化(nodejs)导入导出的概念,希望对其他人有所帮助。

二、两者基础对比

对于两种模块化的基础使用方式容易混淆,无非是没有认认真真地对比过它们,大家不愿意做,我来为大家节省时间:

导出语法导入语法
commonjs模块化1. module.exports=xxx 2.exports.变量名=xxxconst xxx=require()
es6模块化1.export default xxx 2. export xxx1.import {xxx} from 2.import xxx from 3.import * as xxx from

其中xxx可以是函数、变量、类等任意对象。

三、commonjs导出

简单举例:

module.exports={test:'1'
}exports.test=1

当然实际情况可能还有很多变种语法,但是初学者只需理解这两个最根本的即可。

学知识就和练葵花宝典一样,要学最紧要的心法,切了最重要,至于用针还是用剑,那就是变招,终会根据喜好水到渠成。

上面两个导出的效果一样,最终都是会得到一个对象exports,exports对象里有个key是“test”,对应的value是1。

两种写法无非就是一个明确告诉你exports对象是module的一个元素,另一个简洁化,没有告诉你exports前面其实还有个module。

就像前端写全局变量,直接写a=1和写window.a=1,有区别吗?没区别!

当然这是为了方便大家记忆,实际上exports是一个指向module.exports的引用,这样说有点过于拗口,用代码描述,就是底层代码通过exports===module.exports创建了exports。

所以我们使用exports时,千万要写成exports.test=1的形式,如果写成exports=1,那么exports和module.exports之间的关系很可能就被你强行断开,导致出错。(当然我没这么二去试过)

四、es6导出

我为什么在介绍commonjs导出后,不接着介绍commonjs对应的导入?因为能看这篇文章的,我相信一定是对导入导出语法有一点了解,但又不多,大家会对commonjs导入和导出混淆吗?不会,大家更容易混淆的是commonjs的导出与es6的导出。

简单例子:

export default function test(){
}
export default class{}
export default 1export const test=function(){}
export const test=class{
}
export const test=1

其实对照着看commonjs和es6导出,很容易分辨出来。它俩唯一容易混淆的地方就是都有export这几个字母而已,但是两者的export单词代表的含义却完全不同。

commonjs中的是exports,它是一个对象,是要导出去的对象,所以带着s很好理解,因为这个对象可能有很多属性。

es6中的是export,它是一个关键字,是类似于function 、class这种具有一定功能性的方法,它又不是单纯的对象。不要杠前端一切皆对象,我相信能杠这种话的人一定知道我说的单纯对象是什么意思。

聊到这就很清晰了,commonjs中导出的就是这个exports对象,es6中导出的是export后面的对象。至于细节,两者的对象都可以是什么,构造这个对象有没有更多的方式,能不能重命名等等等等,自己去看看文档就知道了,我不建议死记硬背。

理解了基础,其他的用的多了自然就知道了,用的不多,说明不那么重要。

再简单聊下es6导出的两种形式,我们只需要理解export default中的default才是要导出去的变量,把它后面的对象赋值给default,然后导出,就是默认导出方式。所以default后面一定是一个对象或对象的引用,而不是声明语句。

如果写成export default const test=1,这就直接给es6干懵圈了,它不知道该导出default还是导出test。但如果写成:

const test=1
export default test

就是可以的,因为导出的还是default,只不过把变量a的值赋值给default了。就是说你可以写let a=b=c=3,但你不能写let a=let b=let c=3。

同理,export 1也不行,因为export是关键字,它要导出一个变量,1不是变量,但是export test就可以,因为test是我们声明的一个变量,不论它是在export这句话里声明的,还是在之前声明的。

这里,我建议不要使用export default默认导出方式,我有很长一段时间就只用export const test=1这一种写法,覆盖百分之九十九的业务场景。export default个人理解其实更多是插件、基础组件等需要考虑的。进阶内容就不展开说了,这是另外的价钱。

五、总结

本来打算一篇文章写完的,结果发现不管怎么压缩,都需要很长的篇幅,还是把导入导出分开阐述吧。感觉读完本文有所收获,请搜索博主下一篇关于导入import的讲解。

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

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

相关文章

【SpringBoot】application配置(5)

type-aliases-package: com.rabbiter.cm.domaintype-aliases-package: 这个配置用于指定mybatis的别名,别名是一个简化的方式,让你在Mapper xml 文件中引用java类型,而不需要使用使用完整的类名。例如,如果你在 com.rabbiter.cm.d…

pymunk初步:设置重力

文章目录 官方示例可视化 官方示例 pymunk是一款2D物理引擎,在游戏开发中十分有用。安装过程无坑 pip install pymunk下面举出官网的一个案例,来简述pymunk的使用流程 import pymunkspace pymunk.Space() space.gravity 0,-981body pymunk.Body() …

Vue组件通信的方式

文章目录 props 父传子$emit 子传父事件总线&#xff08;Event Bus&#xff09;使用Vuex\Pinia状态管理库使用provide/inject props 父传子 父组件向子组件传递数据&#xff1a;通过props属性将数据从父组件传递给子组件。 <template> <div> <child-compone…

邮件群发系统怎么用呢?专业的邮件群发器?

邮件群发系统哪个比较好&#xff1f;邮件营销系统的效果怎么样&#xff1f; 在现代商业活动中&#xff0c;邮件群发系统已成为企业营销的重要工具。那么&#xff0c;邮件群发系统究竟如何使用呢&#xff1f;接下来&#xff0c;蜂邮EDM将为您详细解析邮件群发系统的使用方法。 …

股市反转数据分析

20240206是一个很好的股市反转数据分析的样本。因为之前的1月份2月前3个交易日也就是2月1日&#xff0c;2月2日和2月5日基本都是大跌。数据记录如下&#xff1a; 指数名称指数代码收盘价 [日期] 20231229 [单位] 元收盘价 [日期] 20240205 [单位] 元区间涨跌幅上证指数000001.…

深度学习图像分类相关概念简析+个人举例3(CNN相关补充,附详细举例代码1)

【1】激活函数&#xff08;Activation Function&#xff09;&#xff1a;在深度学习&#xff08;CNN&#xff09;中&#xff0c;激活函数用于引入非线性性质&#xff0c;帮助模型学习复杂的关系。常见的激活函数有ReLU、Sigmoid和Tanh等。 &#xff08;1&#xff09;ReLU激活函…

Godot 游戏引擎个人评价和2024年规划(无代码)

文章目录 前言Godot C# .net core 开发简单评价Godot相关网址可行性 Godot(GDScirpt) Vs CocosGodot VS UnityUnity 的裁员Unity的股票Unity的历史遗留问题&#xff1a;Mono和.net core.net core的开发者&#xff0c;微软 个人的独立游戏Steam平台分成说明独立游戏的选题美术风…

C# CAD交互界面-自定义面板集-添加快捷命令(五)

运行环境 vs2022 c# cad2016 调试成功 一、引用 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Windows; using System; using System.Drawing; using System.Windows.Forms; 二、代码说明 [CommandMethod("Cre…

Linux CentOS stream 9 alias

alias命令在Linux中用于创建命令别名。它允许用户为常用的命令或命令组合创建短而易记的别名,从而提高工作效率。 alias命令与windows中的快捷方式相同,执行别名时,终端解释器就进行查询与转换,进而执行原来的完整命令。 熟练使用alias命令可以使我们将一长串命令或者一些…

android下library打包aar并上传到maven,嵌入版的app

android嵌入版 准备工作简化代码到三方app上传maven自动打包上面已经完成了library到三方app的流程 这几天在研究android下怎么把自己的项目当作一个library给到另一个app做嵌入使用&#xff0c;把这些记录下来&#xff0c;方便以后参考 准备工作 1.需要了解一些gradle 命令打…

限制Unity帧率的方式

1&#xff09;限制Unity帧率的方式 2&#xff09;只在编辑器内&#xff0c;纹理不开启Read&Write情况下&#xff0c;如何获取纹理所有颜色值 3&#xff09;如何在FBX剔除Lit.shader依 4&#xff09;如何在iPhone 12mini设备上禁止竖屏 这是第373篇UWA技术知识分享的推送&am…

LInux页高速缓存和页写回

页缓存 页缓存是由内存中的物理页面组成的&#xff0c;其内容对应磁盘上的物理块。 页缓存大小能动态调整&#xff0c;可以占用空闲内存以扩大大小&#xff0c;也可以自我收缩缓解内存使用压力。 如果读一个磁盘内容&#xff0c;我们会读内存&#xff0c;如果存在&#xff0c;…

游戏开发-会飞的小鸟(已完结,附源码)

游戏开发-会飞的小鸟&#xff08;已完结&#xff0c;附源码&#xff09; 你将学到的课程链接详细介绍 你将学到的 掌握Java编程的基本技能开发出自己的“会飞的小鸟”游戏对面向对象编程有深刻的理解学会运用常见算法和数据结构解决问题能够独立调试和优化自己的代码 课程链接…

python二维数组初始化的一个极其隐蔽的bug(浅拷贝)

初始化一个三行三列的矩阵 m n 3初始化方式1 a [[0 for i in range(m)] for j in range(n)]初始化方式2 b [] row [0 for i in range(0,m)] for i in range(0,n):b.append(row)分别输出两个初始化的结果 for row in a:print(row) for row in b:print(row)当前的输出为…

用C语言实现单个网页图片爬虫

这段代码是一个使用C语言和libcurl库编写的程序,用于从指定的URL下载图片并保存到本地文件中。下面是该代码的详细介绍: 包含头文件: c #include <stdio.h> #include <curl/curl.h> 这两个头文件分别是标准I/O库和libcurl库的头文件。 定义回调函数: c …

标准库 STM32+EC11编码器+I2C ssd1306多级菜单例程

标准库 STM32EC11编码器I2C ssd1306多级菜单例程 &#x1f4cc;原创项目来源于&#xff1a;https://github.com/AdamLoong/Embedded_Menu_Simple&#x1f4cd;相关功能演示观看&#xff1a;https://space.bilibili.com/74495335 单片机多级菜单v1.2 &#x1f449;本次采用的是原…

springboot162基于SpringBoot的体育馆管理系统的设计与实现

体育馆管理系统 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕…

算法练习-二叉树的节点个数【完全/普通二叉树】(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;二叉树 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨…

广义表-C语言

广义表&#xff08;Generalized List&#xff09;是一种扩展了线性表的数据结构&#xff0c;它在线性表的基础上增加了元素可以是表的特点。在广义表中&#xff0c;元素不仅可以是单个的数据元素&#xff0c;还可以是一个子表&#xff0c;而子表中的元素也可以是数据元素或其他…

Java on VS Code 2024年1月更新|JDK 21支持!测试覆盖率功能最新体验!

作者&#xff1a;Nick Zhu - Senior Program Manager, Developer Division At Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 Visual Studio Code for Java 2024年的第一期更新&#xff01;提前祝愿大家春节快乐&#xff01;在本博客中&#xff0c;我们将有…