在es module出现之前还有社区推出amd和cmd的规范,这两者还有其特定的编写方式,使用起来不算很方便。es module被官方推出来就成为了浏览器端实现模块化的一个很好的方案。
 
想要在浏览器端使用 es module ,首先在 html 当中引入 js 文件的时候,就需要将script标签中的type设置为module
index.html
<script src="b.js" type="module"></script>

这样浏览器才能执行使用es module的js文件,定义之后就可以在对应的js文件中使用模块化的方式来编写文件,导出和导入的方式有几种,但都是相同的关键字,export 与 import,一起来看看可以如何定义导入导出。

 
第一种,直接导出定义的变量,这种方式导出的内容互不关联,适用于导出自己定义的常量,redux中定义action就经常使用这种导出
a.js
export const name = 'alice'
export const age = 16 b.js
import { name, age } from "./a.js";
console.log(name, age) // alice 16

第二种,先定义变量,再使用 export 一起导出,导入方式可以使用上面的方式,也可以通过一个 * 来将所有的导出内容定义为一个对象,从对象中再去取值 ,redux中定义的reducer、action在 index.js 中导出会经常使用这种方式

a.js
const name = 'alice'
const age = 16
export { name, age } b.js
import * as obj from "./a.js";
console.log(obj.name, obj.age) // alice 16

第三种,给导出的变量取别名,导入的变量同样可以取别名,当名字发生冲突时、导出变量名太长时,都可以取个别名,取完别名之后,原先的名字就不可用了

a.js
const name = 'alice'
const age = 16 export { name as myName, age as myAge } b.js
import { myName as aliceName, myAge } from "./a.js"; console.log(aliceName, myAge) // alice 16

第四种,默认导出,默认导出在一个js文件中只允许存在一个,默认导出可以不用定义变量名,在导入的时候可以随意起名,并且导入的时候不需要加 {} ,这样的定义方式在编写redux中的reducer函数时很常见

a.js
export default function(){
return 'hello world'
} b.js
import foo from './a.js' console.log(foo()) // hello world

第五种,合并导出,在b.js文件导入a.js文件中导出的内容,b.js文件不对导入的内容做任何操作,直接导出,最后由index.js导入b.js并进行处理

a.js
export const name = 'alice' b.js
export { name } from './a.js' index.js
import { name } from './b.js' console.log(name) // alice

以上是es module的具体的语法表现,导入导出的方式有很多,可以根据具体需要的场景进行判断和使用,另外,es module 还有一些特点。

1、异步加载,当script标签中定义 type="module"之后,相当于给js标签加上了 async 的标识,代表异步加载资源,不会阻塞其它内容的执行,按照如下代码,打印的hi有可能是在引入的index.js文件之前,要根据 index.js 的执行速度来判断。
<script src="index.js" type="module"></script>
<script type="text/javascript">
console.log('hi')
</script>

2、编译时解析,简单来说javascript的执行过程需要将原代码编译成抽象语法树,运行的时候再转成机器可识别的语言,在编译阶段解析数据,并不知道该不该加载此js文件,只有等到文件运行时,才知道文件里具体逻辑的执行过程,所以不能够在编译时解析的模块化方式出现类似条件判断,动态引入等代码

const flag = true
if(flag){
import xxx from './a.js'
}

如果真的需要根据一些条件才执行代码,可以通过 require 函数来动态的引入,require函数执行完是一个promise对象,可以通过then方法来获取所需要的数据

const flag = true

if(flag){
import('./b.js')
.then(({name})=>{
console.log(name)
})
}
3、export 关键字后面跟的大括号并不是代表对象,在对象中也没有通过 as 取别名这样的方式,如果我们尝试以下把它当成对象来导出,一定是会报错的
let name = 'alice'
export {
name: name
}

 
 export 导出的 name 就对应着 name 这个变量,如果修改 name 的值,export 导出的内容会发生变化,import 导入的内容也会发生变化
a.js
let name = 'kiki', age = 18 setTimeout(()=>{
name = '嘻嘻嘻'
}, 1000) export {
name,
age
} b.js
import { name, age } from './a.js' console.log(name) setTimeout(()=>{
console.log(name)
},2000) // 依次打印 kiki 嘻嘻嘻

export 导出的内容有一个模块环境记录,用来记录导出时更改的变量,当变量更改时,使用新的变量值替换旧变量值

 
但是不可以反向的修改,因为 import 导入的内容是一个通过 const 定义的常量,常量是不可以被修改的,以下操作是不可行的
import { name } from './a.js'
name = '哈哈哈哈'

  
一般而言,我们都是在浏览器端使用 es module,如果想要在 node 端编写es module代码,可以有两种方式,一种是在 package.json 中配置 type:module,另一种是直接把js文件的后缀名为改为 .mjs
 
 
node端常用的模块化方式是 commonjs,同样是模块化,那么 es module 和 commonjs 之间是否能互相调用呢,看看如下代码
a.mjs
const name = 'alice'
const age = 18 export {
name,
age
} b.js
const a = require('./a.mjs') console.log(a)

以上代码执行会报错 Must use import to load ES Module,而如下的方式在高版本的nodejs中是可以的

a.js
const name = 'alice'
const age = 18 module.exports = {
name,
age
} b.js
import b from './b.js' console.log(b) // { name: 'alice', age: 18 }

以上就是浏览器端模块方式es module的概念与用法,模块化能够更好的将代码分块并复用,nodejs端也有常用实现模块化的方式,即commonjs,如果不熟悉可以看看这篇文章 -> nodejs端模块化方式comomjs详解

浏览器端模块化方式es module详解的更多相关文章

  1. 基于rem的移动端响应式适配方案(详解) 移动端H5页面的设计稿尺寸大小规范

    基于rem的移动端响应式适配方案(详解) : https://www.jb51.net/article/118067.htm 移动端H5页面的设计稿尺寸大小规范 http://www.tuyiyi.c ...

  2. 前端模块化之ES Module

    一.概述 之前提到的几种模块化规范:CommonJS.AMD.CMD都是社区提出的.ES 2015在语言层面上实现了模块功能,且实现简单,可以替代CommonJS和AMD规范,成为在服务器和浏览器通用 ...

  3. 新手入门:史上最全Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

  4. Web端即时通讯技术原理详解

    前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...

  5. Ubuntu14.04下完美安装cloudermanage多种方式(图文详解)(博主推荐)

    说在前面的话 我的机器是总共4台,分别为ubuntucmbigdata1.ubuntucmbigdata2.ubuntucmbigdata3和ubuntucmbigdata4. ClouderaMan ...

  6. JS 模块化- 05 ES Module & 4 大规范总结

    1 ES Module 规范 ES Module 是目前使用较多的模块化规范,在 Vue.React 中大量使用,大家应该非常熟悉.TypeScript 中的模块化与 ES 类似. 1.1 导出模块 ...

  7. JS JavaScript模块化(ES Module/CommonJS/AMD/CMD)

    前言 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了, jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得 ...

  8. Touch事件在移动端web开发中的详解

    一.pc端事件回顾 HTML事件.DOM0事件.DOM2事件 事件对象. 如果上述概念不清楚,请先去了解. 二.移动端事件简介 2.1 pc端事件在移动端的问题 ​ 移动设备主要特点是不配备鼠标,键盘 ...

  9. java操作xml方式比较与详解(DOM、SAX、JDOM、DOM4J)

    java中四种操作(DOM.SAX.JDOM.DOM4J)xml方式的比较与详解     1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准. ...

  10. 新手入门贴:史上最全Web端即时通讯技术原理详解

    关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...

随机推荐

  1. MySQL如何获取binlog的开始时间和结束时间

    MySQL数据库恢复到指定时间点时,我们必须通过MySQL全备+MySQL增量备份(可选)+MySQL的二进制日志(binlog)进行重放来恢复到指定时间点,实际的生产环境中,可能一段时间内生成了多个 ...

  2. dos命令、变量、字符编码、注释、用户输入

    一.dos命令 1.dos命令 c: 切换盘符 cd c:\pthon 切换路径 dir 查看目录下的文件 cd .. 返回到上一层目录 cd ../.. 返回到上一层的上一层目录 二.环境变量的配置 ...

  3. QUIC在京东直播的应用与实践

    作者:京东零售 周凯 一. 前言与背景 国内的互联网直播技术从2005年前后兴起,彼时最具代表性的直播产品是由PPLive创始人姚欣在华中科技大学就读期间发起的校园直播项目PPLive.当时的直播技术 ...

  4. Extjs4 Tree Grid 综合示例(展开、编辑列、获取数据)

    用json数据模拟后端传回来的结果,Extjs tree支持两种类型的结构,一种是带children属性的嵌套式的数据,一种是扁平的,每条记录带pid的数据,带pid的添加配置项可以自动解析成树形结构 ...

  5. 2022-08-01:以下go语言代码输出什么?A:panic;B:5;C:6;D:编译错误。 package main import ( “fmt“ ) func main() {

    2022-08-01:以下go语言代码输出什么?A:panic:B:5:C:6:D:编译错误. package main import ( "fmt" ) func main() ...

  6. 2021-04-17:给定一个整型数组 arr,数组中的每个值都为正数,表示完成一幅画作需要的时间,再 给定 一个整数 num,表示画匠的数量,每个画匠只能画连在一起的画作。所有的画家 并行工作,请

    2021-04-17:给定一个整型数组 arr,数组中的每个值都为正数,表示完成一幅画作需要的时间,再 给定 一个整数 num,表示画匠的数量,每个画匠只能画连在一起的画作.所有的画家 并行工作,请 ...

  7. 百度云原生数据库GaiaDB的HTAP与多地多活技术实践

    摘要:云原生数据库在使用存算分离技术后,可以在完全兼容MYSQL协议和语法的情况下,极大提升单实例所能承载的数据规模与吞吐能力上限.但除了对客户端兼容外,对整个数据生态(地域容灾,数据分析,备份恢复) ...

  8. 【Python&GIS】GDAL栅格转面&计算矢量面积

            GDAL(Geospatial Data Abstraction Library)是一个在X/MIT许可协议下的开源栅格空间数据转换库.它利用抽象数据模型来表达所支持的各种文件格式.它 ...

  9. 5月这几个API安全漏洞值得注意!

    5月份的一些API安全漏洞报告 希望大家查漏补缺 及时修复自己API可能出现的漏洞 No.1 微软.NET Core漏洞 漏洞详情:微软官方发布公告称,其.NET Core 2.1.3.1和5.0版本 ...

  10. 基于php的外卖订餐网站(php+mysql)

    介绍 一个基于php的外卖订餐网站,包括前端和后台. 效果演示 http://101.43.124.118:8001/admin 源码地址 https://github.com/geeeeeeeek/ ...