(区别、详解、使用)module.exports与exports,export与export default,import 与require

简介: 变量的导出涉及到四个关键字module.exports与exports,export与export default,其中module.exports与exports是符合CommonJS模块规范的。

导出简介(里面有小细节请仔细阅读)

变量的导出涉及到四个关键字module.exports与exports,export与export default,

其中module.exports与exports是符合CommonJS模块规范的。

export与export default是es6用来导出模块的。


module.exports与exports

module是一个对象,代指的整个js文件,而他的exports属性就是该js文件对外暴露的对象,只要是module.exports的属性内的值都能被访问到(包括字符串,数字,对象,函数)。

exports指向了module.exports就相当于在js文件开头添加了这样一段代码

var exports = module.exports;

总之我们只要记住一点:module.exports指向的东西,就是我们要导出的东西


1.该js文件要导出的值即为test

const test=1;
  module.exports ={test};
  console.log(module.exports)

1024b19218af40c7a8a6290c6186518d.png


2.该js文件要导出的值即为test1和test2

const test1="test1";
const test2= "test2";
module.exports ={test1};
module.exports.test2 =test2;
console.log(module.exports)

1024b19218af40c7a8a6290c6186518d.png


3. 注意这里我是先给module.exports.test2赋值,然后给module.exports赋值,因此{test1}覆盖了原来的test2,因此module.exports中只有test1

const test1="s";
  const test2= "ss";
  const test3="sss";
  module.exports.test2 =test2;
  module.exports ={test1};
  console.log(module.exports)

1024b19218af40c7a8a6290c6186518d.png

4. 该js文件要导出的值即为test2

const test1="s";
  const test2= "ss";
  const test3="sss";
  exports.test2 = test2;
  console.log(module.exports)

1024b19218af40c7a8a6290c6186518d.png

5. 注意这里(注意点),module.exports ={test1};改变了module.exports指向的引用,exports还指向之前的module.exports引用,因此无论exports.test2 = test2;在哪里执行都不能改变该js文件索要暴露的值。所以如果要改变module.exports指向的引用,就不要使用exports

1024b19218af40c7a8a6290c6186518d.png


export与export default

这两个是es6的语法,在小程序中也是可以使用的

export与export default都是用来导出变量的,并且他们两个作用与exports相同,只是语法不同

二者同样是给module.exports赋值,export可以赋多个值,export default只能赋一个值(只能使用一次).

export后面跟的是声明或者语句,export default后面跟的是表达式

1.根据输出可知:export default test1;等价于exports.default = test1; export {test2};等价于exports.test2 = test2;

const test1="s";
  const test2= "ss";
  const test3="sss";
  export  default test1;
  export {test2};
  export const test4="ssss";
  console.log(module.exports)

1024b19218af40c7a8a6290c6186518d.png


(坑)export {}这个语法比较特殊,{}花括号中,必须是提前定义好的

(1)正确

const test1 = "test1";
export {
  test1//这种可以
};
console.log(module.exports)

1024b19218af40c7a8a6290c6186518d.png


(2)错误

export {
  test1:1
};
console.log(module.exports)

1024b19218af40c7a8a6290c6186518d.png

2.可见:要想使用export或者export defalut 就不能改变module.exports指向的引用

const test1="s";
  const test2= "ss";
  const test3="sss";
  const test4="ssss";
  export  default test1;
  export {test2};
  module.exports ={test3};//这里进行了指向更改
  export {test4};
  console.log(module.exports)

1024b19218af40c7a8a6290c6186518d.png

(坑)上面第七行代码进行了,执行module的指向更改,后续如果引入的话,就只会引入module.exports最新的一次指向


导入简介

我们知道了如何导出变量,那肯定还得知道如何导入

使用require 与import来导入

require 是是符合CommonJS模块规范的。import是es6用来导出模块的。

require 可以在js文件中的任意位置使用,import只能在文件开头使用

require

require比较好理解,他可以直接获取module.exports的对象,进而使用其中的属性和方法

//test.js中
const test1="s";
const test2= "ss";
const test3="sss";
const test4="ssss";
export  default test1;
export {test2};
exports.test3=test3;
module.exports.test4=test4;
//引用的文件中
var test = require("../../utils/test.js");
console.log(test)

1024b19218af40c7a8a6290c6186518d.png


import

import是直接获取module.exports对象的属性和方法


(注意)如果同时存在自定义的和default那么impor的时候需要注意

方法1、方法2、方法3都在下面的代码里面

  //test.js中
  const test1="s";
  const test2= "ss";
  const test3="sss";
  const test4="ssss";
  export  default test1;//导出默认
  export {test2};
  exports.test3=test3;
  module.exports.test4=test4;
  //引用的文件中,import在文件开头
    //情况1(用法)
  import {test2,test3,test4} from "../../utils/test.js"//这种情况下对test2 test3 test4进行单独导出
    //情况2(用法)
    import test0 from "../../utils/test.js"//这种情况下只对module.exports中的default的值单独导出并且赋值给test0
    //情况3(用法)
    import * as all from "../../utils/test.js"//这种情况下将module.exports的所有值都付给all


export defalut 就是默认输出的值,在使用import时,要想使用这个默认的值就需要只获取一个值(不加大括号,变量名随便写)

  //test.js中
  const test1="s";
  export  default test1;
  //引用的文件中,import在文件开头
  import SuiBianXie from "../../utils/test.js"
  console.log(SuiBianXie)

1024b19218af40c7a8a6290c6186518d.png


require和import区别

区别1:模块加载的时间

require:运行时加载

import:编译时加载(效率更高)【由于是编译时加载,所以import命令会提升到整个模块的头部】


区别2:模块的本质

require:模块就是对象,输入时必须查找对象属性

import:ES6 模块不是对象,而是通过 export 命令显式指定输出的代码,再通过 import 命令输入(这也导致了没法引用 ES6 模块本身,因为它不是对象)。由于 ES6 模块是编译时加载,使得静态分析成为可能。有了它,就能进一步拓宽 JavaScript 的语法,比如引入宏(macro)和类型检验(type system)这些只能靠静态分析实现的功能。


区别3:严格模式

CommonJs模块和ES6模块的区别:

(1)CommonJs模块默认采用非严格模式

(2)ES6 的模块自动采用严格模式,不管你有没有在模块头部加上 “use strict”;

(3)CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用


ES6 模块之中,顶层的 this 指向 undefined ,即不应该在顶层代码使用 this


目录
相关文章
|
JSON 缓存 JavaScript
❤Nodejs 第十章(用户信息token认证和登录接口开发)
【4月更文挑战第10天】本文介绍了Node.js中实现用户信息token认证和登录接口的步骤。express-jwt的使用,接着创建基本的Express服务器,然后导入并使用jsonwebtoken和express-jwt。设置一个密钥,并定义一个中间件处理token验证。示例展示了登录接口的实现。遇到登录判断失效的问题后,对判断条件进行了优化。
822 2
|
JSON JavaScript 前端开发
❤Nodejs 第九章(token身份认证和express-jwt的安装认识)
【4月更文挑战第9天】Node.js第九章介绍了Token身份认证,特别是JWT(JSON Web Token)作为跨域认证的解决方案。JWT由Header、Payload和Signature三部分组成,用于在客户端和服务器间安全传输用户信息。前端收到JWT后存储在localStorage或sessionStorage中,并在请求头中发送。Express-JWT是一个中间件,用于解析JWT。基本用法包括设置secret和algorithms。注意安全问题,避免混合使用不同算法以防止降级攻击。
497 0
|
JavaScript API
uniapp使用Vue3挂载函数到全局
uniapp使用Vue3挂载函数到全局
1619 0
|
Web App开发 前端开发 JavaScript
React 之 requestIdleCallback 来了解一下
React 之 requestIdleCallback 来了解一下
1798 0
|
JavaScript 前端开发
不懂module.exports、exports、export的区别,我惨遭diss
【10月更文挑战第22天】不懂module.exports、exports、export的区别,我惨遭diss
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
11324 122
|
11月前
|
人工智能 自然语言处理 前端开发
上线几天,轻松斩获10k,开源通用AI智能体Suna:一句话自动处理Excel/爬数据/写报告,程序员私人助理诞生!
Suna是由Kortix推出的全球首个开源通用型AI Agent,可通过自然语言对话自动完成浏览器操作、数据分析、系统管理等复杂任务。它具有“执行力”,能像人类员工一样理解指令并操作数字工具,支持自托管保障数据安全,适用于市场分析、学术研究、企业办公等场景。Suna的核心优势在于实现“语言→行动”的转化,适合需要实际操作的任务,如爬虫、报表生成和网站部署。项目地址为:https://github.com/kortix-ai/suna。
1030 0
|
JavaScript Java CDN
vue3完整教程从入门到精通(新人必学1,vue3快速上手)
本文提供了Vue 3从入门到精通的完整教程,涵盖了创建Vue应用、通过CDN使用Vue、定义网站以及使用ES模块构建版本的步骤和示例代码。
11046 1
vue3完整教程从入门到精通(新人必学1,vue3快速上手)
|
人工智能 自然语言处理 Java
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
文章介绍了Spring AI,这是Spring团队开发的新组件,旨在为Java开发者提供易于集成的人工智能API,包括机器学习、自然语言处理和图像识别等功能,并通过实际代码示例展示了如何快速集成和使用这些AI技术。
13563 4
Spring AI,Spring团队开发的新组件,Java工程师快来一起体验吧
|
JSON 前端开发 算法
vite打包优化vite-plugin-compression的使用
【8月更文挑战第4天】vite打包优化vite-plugin-compression的使用
2340 4