JavaScript中的export、export default、exports和module.exports(export、export default、exports使用详细)

这篇具有很好参考价值的文章主要介绍了JavaScript中的export、export default、exports和module.exports(export、export default、exports使用详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介: 在JavaScript中,export 和 export default 是 ES6 模块系统的核心部分,用于从文件中导出函数、关键字,对象或值,使其可以在其他文件中通过 import 语句导入和使用,而 exports和 module.exports 是CommonJS模块系统的一部分,在 Node.js 环境中,你可以使用 exports 或 module.exports 来导出模块,但这并不是 ES6 标准的一部分。

Tips:默认的js文件中是不支持es6中的import、export语法的,因为Node.js 在早期版本中采用的是 CommonJS 模块规范,它使用 require 和 module.exports 来导入和导出模块。

如何启用 ES6 模块支持?

  1. 在 package.json 文件中设置 "type": "module",这样 Node.js 就会将所有 .js 文件视为 ES6 模块。
  2. 将文件扩展名改为 .mjs,这样 Node.js 会自动将其视为 ES6 模块。
  3. 在html的script 标签中添加type="module"属性,​​​​​​​就像这样<script type="module" src="main.js"></script>。

1、export (ES6)

注意事项:

导出时(export)

  1. 命名导出:使用export关键字导出变量、函数、类或值时,需要为它们指定名称。这些名称将在其他模块中用于导入
  2. 默认导出与命名导出:export default用于导出模块的默认值,而命名导出使用export关键字后跟变量名或函数名。一个模块只能有一个默认导出,但可以有多个命名导出
  3. 导出表达式:你可以直接导出变量、函数或类的值,或者导出它们的计算结果(如表达式)。
  4. 重新导出:你可以使用export { name1, name2, ... } from 'module-name'语法来重新导出另一个模块的命名导出。

引入时(import)

  1. 命名匹配:当使用命名导入时,必须确保导入的名称与导出模块中定义的名称完全匹配
  2. 默认导入与命名导入:使用import关键字时,可以指定一个名称来接收默认导出(import name from 'module-name'),或者使用花括号来接收命名导出(import { name1, name2 } from 'module-name')。
  3. 静态分析:与默认导出一样,import语句也是静态的,需要在编译时确定模块的路径。
  4. 路径正确性:确保在import语句中指定的模块路径是正确的。相对路径或绝对路径都可以,但如果是相对路径,需要注意当前文件与目标模块文件之间的相对位置。
  5. 模块加载:import语句会在运行时加载模块,如果模块不存在或发生错误,程序将抛出异常。

export 关键字是ES6模块系统的一部分,它允许你从一个文件中导出多个变量、函数、类或任何其他值。导入时,你可以根据需要选择性地导入这些值。

实例1
// myModule.js  
export const myVariable = "Hello from myVariable!";  
export function myFunction() {  
  console.log("Hello from myFunction!");  
}

// myIndex.js
import { myVariable, myFunction } from './myModule';  
console.log(myVariable); // 输出 "Hello from myVariable!"  
myFunction(); // 输出 "Hello from myFunction!"


实例2
// debounce.js导出函数
// 防抖函数实现  
function debounce(func, wait) {  
  let timeout;  
  return function() {  
    const context = this;  
    const args = arguments;  
    clearTimeout(timeout);  
    timeout = setTimeout(() => {  
      func.apply(context, args);  
    }, wait);  
  };  
}   
export { debounce };// 使用 export 导出防抖函数 

// app.js  
// 导入防抖函数  
import { debounce } from './debounce';  
// 假设你有一个需要防抖的函数  
function doSomething() {  
  console.log('Doing something...');  
}   
// 使用防抖函数包装 doSomething  
const debouncedDoSomething = debounce(doSomething, 500); // 设置500毫秒的防抖时间  
// 在某个高频事件中调用防抖函数  
window.addEventListener('resize', debouncedDoSomething);

2、export default (ES6)

注意事项:

导出时(export default)

  1. 单一导出:export default 只能用于导出一个模块、函数、对象或值。你不能在同一个文件中使用多个 export default
  2. 命名无要求:在导出时,你可以为 export default 的内容指定任何名称,但在引入时这个名称会被忽略
  3. 函数表达式:你可以直接使用函数表达式进行默认导出,如 export default function myFunc() {},或者使用匿名函数 export default function() {}
  4. 变量导出:虽然不能直接使用 export default let variable = ... 这样的语法,但你可以先将变量赋值给一个函数或对象,然后使用 export default 导出这个函数或对象。

引入时(import)

  1. 命名自由:在引入时,你可以为导入的模块指定任何名称,因为 export default 允许你在导入时使用任意名称
  2. 无需花括号:与命名导出不同,引入默认导出时不需要使用花括号 {}
  3. 静态分析:由于 import 语句是静态的,编译器需要在编译时就能确定模块的路径。这意味着你不能在运行时动态地改变 import 的路径。
  4. 路径正确性:确保引入路径(./path/to/module)是正确的,否则会导致模块未找到的错误。

export default 允许你为一个模块指定一个默认导出。这意味着导入该模块的文件可以使用任何名称来接收这个默认导出,而不仅仅是在导出时使用的名称。

实例1
// myModule.js 导出简单对象
const myDefaultValue = "Hello from export default!";  
export default myDefaultValue;

// myIndex.js 引入导出的对象
import anythingModule from './myModule'; 
// 注意这里我们使用了 "anythingModule" 这个名称,但它可以是任何名称  
console.log(anythingModule); // 输出 "Hello from export default!"


实例2
// myObject.js  
// 使用 export default 导出对象
export default {  
  name: 'John Doe',  
  age: 30,  
  greet: function() {  
    console.log('Hello, my name is ' + this.name);  
  }  
};  

// anotherFile.js  
// 这里可以使用任意名称引入导出的对象  
import myCustomObject from './myObject.js';  
// 现在你可以使用引入的对象  
console.log(myCustomObject.name); // 输出 "John Doe"  
myCustomObject.greet(); // 输出 "Hello, my name is John Doe"


实例3
// debounce.js 导出防抖函数
// 防抖函数  
function debounce(func, wait) {  
  let timeout;  
  return function() {  
    const context = this;  
    const args = arguments;  
    clearTimeout(timeout);  
    timeout = setTimeout(() => {  
      func.apply(context, args);  
    }, wait);  
  };  
}  
export default debounce;// 使用 export default 导出防抖函数  

// app.js 引入导出的防抖函数  
import debounce from './debounce';  
// 假设你有一个需要防抖的函数  
function doSomething() {  
  console.log('Doing something...');  
}  
// 使用防抖函数包装 doSomething  
const debouncedDoSomething = debounce(doSomething, 500); // 设置500毫秒的防抖时间  
// 在某个高频事件中调用防抖函数  
window.addEventListener('resize', debouncedDoSomething);

Tips:默认的js文件中是不支持es6中的import、export语法的,

需要在package.json 文件中添加 "type": "module",

或者在html中使用<script type="module" src="main.js"></script>。

3、exports (CommonJS)

注意事项:

导出时(exports)

  1. exports 和 module.exports:exports 是 module.exports 的一个引用。当你为 exports 分配一个新值时,它不再引用 module.exports。因此,通常推荐直接使用 module.exports,以避免混淆
  2. 导出类型:你可以导出函数、对象、值等。如果导出一个单一的值,通常使用 module.exports = value;。如果导出多个值,则使用 exports.name = value; 或 module.exports = { name: value };。
  3. 不要混用:在同一个模块中,不要混用 exports 和 module.exports 来导出不同的内容,因为这会导致混淆和不可预期的行为
  4. 导出函数或类:当你导出函数或类时,可以直接将函数或类赋值给 module.exports。

引入时(require)

  1. 路径:使用 require 引入模块时,需要提供正确的文件路径。可以是相对路径(如 ./myModule)或绝对路径(如 /path/to/myModule)。此外,Node.js 还会查找 node_modules 目录中的模块。
  2. 赋值:require 语句会将引入的模块内容赋值给一个变量。你可以为这个变量指定任何名称
  3. 缓存:Node.js 会缓存已加载的模块,这意味着多次 require 同一个模块会返回相同的对象(除非使用 require.cache 手动清除缓存)。
  4. 循环依赖:虽然Node.js可以处理一定程度的循环依赖,但过度使用或不当使用循环依赖可能导致不可预测的行为或错误。因此,应尽量避免不必要的循环依赖。

exports 对象在Node.js环境中特别常见,它是模块系统的一部分。当你创建一个新的模块文件时,exports 对象默认是可用的,你可以向它添加属性,这些属性可以在其他文件中通过 require 函数导入使用。

实例1
// myModule.js  
exports.myFunction = function() {  
  console.log("Hello from myFunction!");  
};  
exports.myVariable = "Hello from myVariable!";

// myIndex.js
const myModule = require('./myModule');  
myModule.myFunction(); // 输出 "Hello from myFunction!"  
console.log(myModule.myVariable); // 输出 "Hello from myVariable!"

4、module.exports

注意事项:

导出时(module.exports)

  1. 导出内容:module.exports 可以导出任何 JavaScript 数据类型,包括函数、对象、数组、字符串、数字等。一旦你为 module.exports 分配了一个值,它将替代默认的导出对象。
  2. 不要重复赋值:一旦你为 module.exports 分配了一个值,之后的任何对 module.exports 的赋值操作都将覆盖之前的值。因此,通常建议在文件的顶部进行 module.exports 的赋值
  3. 导出函数:如果你导出的是一个函数,确保该函数在调用时可以访问到它需要的所有外部变量和上下文。
  4. 模块缓存:Node.js 会缓存已加载的模块,这意味着如果你多次 require 同一个模块,它将只执行一次,并返回第一次执行的结果。确保你的模块在导出时处于正确的状态。
  5. 避免循环依赖:虽然 Node.js 可以处理一定程度的循环依赖,但过度使用或不当使用循环依赖可能导致未定义的行为或错误。

引入时(require)

  1. 路径:使用 require 引入模块时,需要提供正确的文件路径。可以是相对路径(如 ./myModule)或绝对路径(如 /path/to/myModule)。如果省略路径,Node.js 将查找 node_modules 目录中的模块。
  2. 命名:你可以为引入的模块指定任何变量名,这通常是模块导出的主要功能的名称
  3. 错误处理:如果 require 无法找到指定的模块,它将抛出一个错误。确保你的代码可以妥善处理这些错误,特别是在动态引入模块时。
  4. 缓存:由于 Node.js 缓存已加载的模块,所以 require 的结果将始终是第一次加载时的结果,除非你清除 require.cache。

可以看到module.exports和exports的使用特性是差不多的,下面是使用实例:

实例1
// myModule.js  
const myValue = 'Hello, world!';  
// 使用 module.exports 导出单一值  
module.exports = myValue;  

// app.js  
// 引入导出的单一值  
const myValue = require('./myModule');  
console.log(myValue); // 输出 "Hello, world!"  


实例2
// myModule.js  
// 使用 module.exports 导出对象  
module.exports = {  
  myFunction: function() { /* ... */ },  
  anotherValue: 'Another value'  
};

// app.js  
// 引入导出的多个值(如果 myModule.js 是这样导出的)  
const myModule = require('./myModule');  
console.log(myModule.myFunction); // 输出 myFunction 函数  
console.log(myModule.anotherValue); // 输出 "Another value"

5、module.exports和exports的使用建议

  • 一致性在你的模块中,选择使用module.exportsexports,并保持一致。这样可以避免混淆,并使得其他开发者更容易理解你的代码
  • 简洁性如果你只需要导出一个值(如一个函数或对象),使用module.exports通常更简洁
  • 扩展性如果你打算逐步添加多个导出项,并且想要保持对exports对象的引用,那么使用exports可能更合适
  • 避免混用不要在同一模块中混用exportsmodule.exports来导出不同的内容,这会导致不可预期的行为

​​​​​​​文章来源地址https://www.toymoban.com/news/detail-850084.html

小结:

  • exports 是CommonJS模块系统的一部分,常见于Node.js环境。
  • export 和 export default 是ES6模块系统的一部分,适用于现代浏览器和Node.js环境(通过Babel等转换工具)。
  • export 允许你导出多个值,而 export default 允许你指定一个默认导出。
  • exports 和 export 在语法和用法上有所不同,但它们都实现了模块化的核心概念,封装和组织代码以便重用。

到了这里,关于JavaScript中的export、export default、exports和module.exports(export、export default、exports使用详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 为什么 export 导出一个字面量会报错而使用 export default 不会报错

    其实总的来说就是 export 导出的是变量的句柄(或者说符号绑定、近似于 C 语言里面的指针,C++里面的变量别名),而 export default 导出的是变量的值。 需要注意的是:模块里面的内容只能在模块内部修改,模块外部只能使用。esModule在语法层面做了一层浅层的保护(即将imp

    2024年02月04日
    浏览(46)
  • 记录--为什么 export 导出一个字面量会报错,而使用 export default 就不会报错?

    其实总的来说就是 export 导出的是变量的句柄(或者说符号绑定、近似于 C 语言里面的指针,C++里面的变量别名),而 export default 导出的是变量的值。 需要注意的是:模块里面的内容只能在模块内部修改,模块外部只能使用。esModule在语法层面做了一层 浅层 的保护(即将i

    2024年01月17日
    浏览(32)
  • Uncaught SyntaxError: The requested module ‘…/xx/xx/x.js’ does not provide an export named ‘default’

    今天遇到这个报错 虽然很低级 ,正因为如此所以做个记录吧。今天在一个文件中import 一个文件, 出现了如下报错: Uncaught SyntaxError: The requested module ‘…/xx/xx/x.js’ does not provide an export named ‘default’ 斗胆翻译一下这句话:意思是这是一个未捕获的语法错误:请求的这个模

    2024年01月21日
    浏览(34)
  • Module的语法, JS中的 export 和 import

    在ES6之前, 社区制定了一些模块加载方案, 最主要的有CommonJS和AMD两种. 前者用于服务器,后者, 用于浏览器 ES6模块的 设计思想是尽量静态化, 使得编译时就能确定模块的依赖关系 ES6模块不是对象, 而是 通过export命令显示指定输出的代码,再通过import命令输入. 上面代码的实质是从

    2024年02月02日
    浏览(33)
  • export default 和 export之间的区别

    export 、export default,都属于ES6里面的语法 1. export与export default均可用于导出常量、函数、文件、模块等 2. 你可以在其它文件或模块中通过import+(常量 | 函数 | 文件 | 模块)名的方式,将其导入,以便能够对其进行使用 3. 在一个文件或模块中,export、import可以有多个,export def

    2023年04月09日
    浏览(26)
  • export和export default和import的说明

    目录 1.说明 2.export 3.import 4.export default 5.总结 1.说明 ES6中,export与export default均可用于导出常量、函数、文件、模块等。 import用于导入其他被导出的常量、函数、文件、模块等。 2.export 一个独立的文件,该文件内部的变量,方法等,外部无法获取。如果想读取其他vue文件中的

    2024年02月05日
    浏览(41)
  • vue中 export default 与 export 写法的区别

    1.1、定义函数 d.js 1.2、使用 a.js export default 命令用于指定模块的默认输出。一个模块只能有一个默认输出,因此 export default 命令 只能使用(导入)一次 2.1、定义函数 d.js 2.1、使用 1)使用方法1:一次性导入所有函数 a.js 这种写法 test() 输出的 dic对象与 export default 是一样的,

    2024年04月24日
    浏览(30)
  • 前端vue打包时遇到‘default‘ is not exported by node_modules/vue/dist/vue.runtime.esm-bundler.js, imported by

    主要原因是由于用到的组件进行npm i时默认使用的是vue2,不支持vue3,但是前端框架使用的是vue3,所以导致重构编码时会报错, 网上查询说         当我们在使用rollup编译es6时,可能会遇到以下报错问题,需要 安装@rollup/plugin-commonjs插件 npm install @rollup/plugin-commonjs 最后,

    2024年02月05日
    浏览(51)
  • export default的作用

    export default 是 JavaScript 的一个语法,用于导出模块的默认成员。 在 JavaScript 中,模块是一种封装了特定功能的代码的单元。通过使用 import 和 export ,你可以将模块中的代码导出到其他文件中使用。 例如,假设你有一个名为 myModule.js 的模块,其中包含一个函数和一个变

    2024年02月07日
    浏览(29)
  • vue封装公共方法(export default install)—2

    定义一validate.js文件内容如下:   xxx.vue文件使用方法: 重点::①、标签传入校验规则;②、this.$valid.rules在规则定义里面调用具体的规则

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包