浏览器端模块化方式es module详解
- index.html
- <script src="b.js" type="module"></script>
这样浏览器才能执行使用es module的js文件,定义之后就可以在对应的js文件中使用模块化的方式来编写文件,导出和导入的方式有几种,但都是相同的关键字,export 与 import,一起来看看可以如何定义导入导出。
- 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 还有一些特点。
- <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)
- })
- }
- let name = 'alice'
- export {
- name: name
- }
- 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 { name } from './a.js'
- name = '哈哈哈哈'

- 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详解的更多相关文章
- 基于rem的移动端响应式适配方案(详解) 移动端H5页面的设计稿尺寸大小规范
基于rem的移动端响应式适配方案(详解) : https://www.jb51.net/article/118067.htm 移动端H5页面的设计稿尺寸大小规范 http://www.tuyiyi.c ...
- 前端模块化之ES Module
一.概述 之前提到的几种模块化规范:CommonJS.AMD.CMD都是社区提出的.ES 2015在语言层面上实现了模块功能,且实现简单,可以替代CommonJS和AMD规范,成为在服务器和浏览器通用 ...
- 新手入门:史上最全Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- Web端即时通讯技术原理详解
前言 有关IM(InstantMessaging)聊天应用(如:微信,QQ).消息推送技术(如:现今移动端APP标配的消息推送模块)等即时通讯应用场景下,大多数都是桌面应用程序或者native应用较为 ...
- Ubuntu14.04下完美安装cloudermanage多种方式(图文详解)(博主推荐)
说在前面的话 我的机器是总共4台,分别为ubuntucmbigdata1.ubuntucmbigdata2.ubuntucmbigdata3和ubuntucmbigdata4. ClouderaMan ...
- JS 模块化- 05 ES Module & 4 大规范总结
1 ES Module 规范 ES Module 是目前使用较多的模块化规范,在 Vue.React 中大量使用,大家应该非常熟悉.TypeScript 中的模块化与 ES 类似. 1.1 导出模块 ...
- JS JavaScript模块化(ES Module/CommonJS/AMD/CMD)
前言 前端开发中,起初只要在script标签中嵌入几十上百行代码就能实现一些基本的交互效果,后来js得到重视,应用也广泛起来了, jQuery,Ajax,Node.Js,MVC,MVVM等的助力也使得 ...
- Touch事件在移动端web开发中的详解
一.pc端事件回顾 HTML事件.DOM0事件.DOM2事件 事件对象. 如果上述概念不清楚,请先去了解. 二.移动端事件简介 2.1 pc端事件在移动端的问题 移动设备主要特点是不配备鼠标,键盘 ...
- java操作xml方式比较与详解(DOM、SAX、JDOM、DOM4J)
java中四种操作(DOM.SAX.JDOM.DOM4J)xml方式的比较与详解 1)DOM(JAXP Crimson解析器) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准. ...
- 新手入门贴:史上最全Web端即时通讯技术原理详解
关于IM(InstantMessaging)即时通信类软件(如微信,QQ),大多数都是桌面应用程序或者native应用较为流行,而网上关于原生IM或桌面IM软件类的通信原理介绍也较多,此处不再赘述.而 ...
随机推荐
- 理解 React 中的 useEffect、useMemo 与 useCallback
useEffect 先理解 useEffect 有助于学习 useMemo 和 useCallback.因为 useMemo 和 useCallback 的实现实际上都是基于 useEffect 的. ...
- map和multimap
map相对于set区别,map具有键值和实值,所有元素根据键值自动排序,pair的第一个值被称为键值key,pair的第二个值被称为实值value.map也是以红黑树为底层实现机制,根据key进行排序 ...
- 2023-01-02:某天,小美在玩一款游戏,游戏开始时,有n台机器, 每台机器都有一个能量水平,分别为a1、a2、…、an, 小美每次操作可以选其中的一台机器,假设选的是第i台, 那小美可以将其变成
2023-01-02:某天,小美在玩一款游戏,游戏开始时,有n台机器, 每台机器都有一个能量水平,分别为a1.a2.-.an, 小美每次操作可以选其中的一台机器,假设选的是第i台, 那小美可以将其变成 ...
- 2022-11-02:以下go语言代码输出什么?A:编译错误;B:apple;C:ant;D:panic。 package main import “fmt“ func main() {
2022-11-02:以下go语言代码输出什么?A:编译错误:B:apple:C:ant:D:panic. package main import "fmt" func main( ...
- 2022-06-19:给出n个数字,你可以任选其中一些数字相乘,相乘之后得到的新数字x, x的价值是x的不同质因子的数量。 返回所有选择数字的方案中,得到的x的价值之和。 来自携程。
2022-06-19:给出n个数字,你可以任选其中一些数字相乘,相乘之后得到的新数字x, x的价值是x的不同质因子的数量. 返回所有选择数字的方案中,得到的x的价值之和. 来自携程. 答案2022-0 ...
- vue全家桶进阶之路5:DOM文档对象模型
一.DOM对象 DOM,全称"DocumentObjectModel(文档对象模型)",它是由W3C组织定义的一个标准. 在前端开发时,我们往往需要在页面某个地方添加一个元素或者删 ...
- 【论文笔记】Deeplab系列
[深度学习]总目录 DeepLab系列是谷歌团队提出的一系列语义分割算法.DeepLab v1于2014年推出,随后2017到2018年又相继推出了DeepLab v2,DeepLab v3以及Dee ...
- 代码随想录算法训练营Day40 动态规划
代码随想录算法训练营 代码随想录算法训练营Day40 动态规划| 343. 整数拆分 96.不同的二叉搜索树 343. 整数拆分 题目链接:343. 整数拆分 给定一个正整数 n,将其拆分为至少两个正 ...
- ODOO配置属性
2字段的属性 2.1 隐藏字段 <field name='model_name' invisible="True"/> 2.2 条件下隐藏 <field name ...
- Google Chrome 超详细使用教程
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中的链接. 调查统计机构 NetMarketShare 发布最新的 7 月份报告,在全球浏览器市场,谷歌 ...