export,export default,exports - 导入导出方法总结

为什么使用模块化?

在JavaScript中,模块化是一种管理代码的方法,它可以将代码分割为不同的模块或文件,并通过特定的方式来管理它们之间的依赖关系和导出关系,使得代码的结构更加清晰、易于维护和扩展。

模块化类别:

  • IIFE 模式:使用立即执行函数表达式(IIFE)来创建私有作用域,从而避免命名冲突。这种方式也称为模块模式,它使用一个匿名函数来封装模块,并返回一个公共接口。

  • CommonJS 模块化:CommonJS 是一个 JavaScript 模块化的标准,它使用 require() 导入模块,exports 导出模块,使得模块可以在不同的环境中使用。Node.js 采用了 CommonJS 标准来实现模块化。

  • AMD 模块化:AMD (Asynchronous Module Definition) 是另一个 JavaScript 模块化的标准,它支持异步加载模块,使用 define() 来定义模块,使用 require() 来加载模块。

  • ES6 模块化:ES6 引入了原生的模块化系统,可以使用 import 和 export 语句导入和导出模块。它提供了静态分析功能,可以在编译时进行优化,使得模块加载更快。

1.export.default的使用方法

特点:

  1. export.default向外暴露的成员,可以使用任意变量来接收
  2. 在一个模块中,export default只允许向外暴露一次
  3. 在一个模块中,可以同时使用export default 和export 向外暴露成员
//export default-默认导出
const m = 100;
export default m; 

//导入
import m from './file'; //可以改变变量名,如:import a from './file';
//export defult const m = 100;// 不可以这样写
//导出
let a = 100;
let b = {};
let c = ()=>{}

export default {
  a,b,c
}

//导入
import module from './file';
console.log( module.a, module.b, module.c );

2.export的使用用法

特点:

  1. 注意:在一个模块中,export 可以向外暴露多个
  2. 注意;使用export导出的成员,必须严格按照导出时候的名称,不能自定义,来使用 {} 按需接收
  3. 注意;使用export导出的成员,如果要换个名称,可以使用 as 起别名
'use strict';
//导出变量
export const a = '100';  
 
 //导出方法
export const dogSay = function(){ 
    console.log('wang wang');
}

//导出函数
export function catSay(){
   console.log('miao miao'); 
}

//导入- export导出的是多个,需要解构取值
import { a as b, dogSay, catSay } from './file';
//或 import * as utils from './file'
//导出
const str = "export的内容";
const year = 2019;
function message(sth) {
  return sth;
}
export { str, year, message }

//导入
import {str, year, message} from './file';
//或:import * as utils from './file';

3.export和export.default混合导出

//导出
const author = "不要秃头啊";

export const age = "18";
export default author;

//导入
import author, { age } from "./name";

console.log(author, "author");
console.log(age, "age");

4.module.exports的使用方法

特点:

  1. exports 是 module.exports 的一个引用,即 exports = module.exports
  2. module.exports 和 exports 不要同时使用,指向会有问题
//导出
module.exports = { checkIDCIP };

//导入
const { checkIDCIP } = require('./utils'); //或者 import { checkIDCIP } from './utils';

exports的使用

// person.js --- 导出
var name = 'Tom';
var age = 18;

exports.getName = function() {
    return name;
}

exports.getAge = function() {
    return age;
}

// main.js --- 导入
var person = require('./person'); //或 import person from './person'

console.log(person.getName()); // 'Tom'
console.log(person.getAge());  // 18

5.CommonJS和ES6 Module的区别总结

一、区别:

  1. CommonJS 模块是运行时加载,ES6 模块是在静态编译期间就确定模块的依赖。

  2. 两者的模块导入导出语法不同,CommonJS是module.exports,exports导出,require导入;ES6则是export导出,import导入。

  3. ES6在编译期间会将所有import提升到顶部,CommonJS不会提升require。

  4. CommonJS 模块的require()是同步加载模块,ES6 模块的import命令是异步加载,有一个独立的模块依赖的解析阶段。

  5. CommonJS导出的是一个值拷贝,会对加载结果进行缓存,一旦内部再修改这个值,则不会同步到外部。ES6 Module是对模块的引⽤,即ES6 Module只存只读,不能改变其值,具体点就是指针指向不能变,类似const 。

  6. import的接⼝是read-only(只读状态),不能修改其变量值。 即不能修改其变量的指针指向,但可以改变变量内部指针指向。可以对commonJS对重新赋值(改变指针指向),但是对ES6 Module赋值会编译报错。

  7. 两者的循环导入的实现原理不同,CommonJS是当模块遇到循环加载时,返回的是当前已经执行的部分的值,而不是代码全部执行后的值,两者可能会有差异。所以,输入变量的时候,必须非常小心。ES6 模块是动态引用,如果使用import从一个模块加载变量(即import foo from 'foo'),那些变量不会被缓存,而是成为一个指向被加载模块的引用,需要开发者自己保证,真正取值的时候能够取到值。

  8. CommonJS中顶层的this指向这个模块本身,而ES6中顶层this指向undefined。

//es6中
var fun = () => {
    mistypedVaraible = 17; //报错,mistypedVaraible is not defined
};
export default fun;
//commonJS中,默认不使用严格模式,可以自定义是否使用严格模式
exports.fun = () => {
 mistypedVaraible = 17; //没有调用严格模式,不会报错
};

二、共同点:

1.CommonJS和ES6 Module都可以对引⼊的对象进⾏赋值,即对对象内部属性的值进⾏改变

参考链接:Module 的加载实现 - ECMAScript 6入门 (ruanyifeng.com)

posted @ 2023-06-30 18:12  天官赐福·  阅读(1310)  评论(0编辑  收藏  举报
返回顶端