js - CommonJs和ES6 module的使用和区别
创始人
2024-06-01 05:44:20
0

文章目录

    • 1,先说区别
    • 2,CommonJS
    • 3,ES6 module

1,先说区别

阮一峰老师在 ES6 入门 中提到 ES6 模块与 CommonJS 模块有一些重大的差异:

它们有三个重大差异:

  • CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
  • CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
  • CommonJS 模块的require()是同步加载模块,ES6 模块的import命令是异步加载,有一个独立的模块依赖的解析阶段。

2,CommonJS

commonjs 规范应用于 nodejs 应用中,在 nodejs 应用中每个文件就是一个模块,拥有自己的作用域,文件中的变量、函数都是私有的,与其他文件相隔离。

CommonJS模块的特点如下:

  • 所有代码都运行在模块作用域,不会污染全局作用域。
  • 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存了,以后再加载,就直接读取缓存结果。要想让模块再次运行,必须清除缓存。
  • 模块加载的顺序,按照其在代码中出现的顺序。
  • 同步的方式加载模块。

使用如下

  • 通过require函数进行导入
  • 通过export或者module.exports导出

CommonJS块暴露的方式有三种:


1,第一种暴露方式: exports.方法 || 属性

let name = 'Eula';
let obj = {name:'Eula',age:18
}
function say(){console.log("我是尤菈");
}// 第一种暴露方式  exports.方法  ||  属性
exports.name = name
exports.obj = obj
exports.say = say;

require接收:

const receive = require('./src/utils.js')
console.log("接收到的",receive);
接收到的 { name: 'Eula', obj: { name: 'Eula', age: 18 }, say: [Function: say] }

2,第二种暴露方式: module.exports.方法 || 属性

let name = 'Eula';
let obj = {name:'Eula',age:18
}
function say(){console.log("我是尤菈");
}
// 第二种暴露方式: module.exports.方法  ||  属性
module.exports.name= name;
module.exports.obj=obj;
module.exports.say = say;

require接收:

const receive = require('./src/utils.js')
console.log("接收到的",receive);
接收到的 { name: 'Eula', obj: { name: 'Eula', age: 18 }, say: [Function: say] }

3,第三种暴露 : module.exports = {方法 , 属性}

直接暴露出去一个对象,对面接收的也是一个对象;

let name = 'Eula';
let obj = {name: 'Eula',age: 18,
};
function say() {console.log('我是尤菈');
}
// 第三种 : module.exports = {方法 , 属性}  直接暴露出一个对象
module.exports = {name,obj,say,
};

接收:

const receive = require('./src/utils.js')
console.log("接收到的",receive);
接收到的 { name: 'Eula', obj: { name: 'Eula', age: 18 }, say: [Function: say] }

注意:
Module.exports = {} 第三种方式和前两种多少有一点点区别;如果说 我们三种方式同时使用 或者说 只要使用第三种方式;那么他会覆盖前两种方式的暴露;

3,ES6 module

ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,旨在成为浏览器和服务器通用的模块解决方案。
其模块功能主要由两个命令构成:exportexport defaultimportexport命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。

使用如下

  • 通过import进行导入
  • 通过export或者export default导出

新建一个html文件和utils.js:

ES6 module 导出方式有两种:

1,第一种导出方式:export逐个导出 或 export { }

把export 逐一写在属性或对象或方法前面;或者直接写到一个对象中一起导出;

// 把export 逐一写在属性或对象或方法前面
export let name = 'Eula';
export let obj = {name: 'Eula',age: 18,
};
export function say() {console.log('我是尤菈');
}// 或者直接写到一个对象中一起暴露
let name = 'Eula';
let obj = {name: 'Eula',age: 18,
};
function say() {console.log('我是尤菈');
}
export { name, obj,say }; // 一起暴露

接收上面导出的值: 接收的时候也有两种方式:逐个接收和整体起别名接收一个对象;



modules




注意:给script标签添加属性type为module,告诉其加载的不是一个普通的js文件,而是一个js模块;
如果直接在浏览器打开这个html文件,会报跨域问题;这是由于设置为type设置为module类型之后,就出现了跨域问题。

当你在某盘符位置下直接打开一个html文件(script标签中引入了某地的某个js文件),则在浏览器地址栏呈现如下:file:///F:/vscode/css3%E8%BF%9B%E9%98%B6/html5-3d-game-scene/indexw.html则会出现跨域问题。而http、https等协议支持跨域请求。

所以解决办法就是通过搭建本地一个服务器去进行资源的问题来解决跨域问题。

我这里使用了 VScode中的Live Serve插件打开就可以了;
在这里插入图片描述

2,第二种导出方式:export default { }

export default { } 默认导出一个对象;不支持对象解构语法;接收的时候也是接收的一个对象;

let name = 'Eula';
let obj = {name: 'Eula',age: 18,
};
function say() {console.log('我是尤菈');
}
// 默认导出
export default  {name,obj,say,
};

接收:


modules

注意:

Es Module 默认开启了严格模式。即便你没有在文件的开头添加 “use strict”;

既然开启了严格模式,严格模式限制有哪些?

主要有以下限制:

  1. 变量必须声明后再使用
  2. 函数的参数不能有同名属性,否则报错
  3. 不能使用 with 语句
  4. 不能对只读属性赋值,否则报错
  5. 不能使用前缀 0 表示八进制数,否则报错
  6. 不能删除不可删除的属性,否则报错
  7. 不能删除变量 delete prop,会报错,只能删除属性 delete global[prop]
  8. eval 和 arguments 不能被重新赋值 arguments
  9. 禁止 this指向全局对象
  10. 增加了保留字(implements、interface、let、package、private、protected、public、static、yield)

End

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...