JavaScript模块化历程(二)

文章目录

      • 4.模块化标准规范(ES Modules)
        • 4.1 如何使用ES6规范
        • 4.2 严格模式
        • 4.3 实际使用
        • 4.4 默认导出
        • 4.5 <scrpit>加载文件的顺序
      • 参考文章

4.模块化标准规范(ES Modules)

ES6 提供的模块化方案叫做 ES Module,简称 esm,现在我开始接触的基本就是这种规范了,写nodejs的时候,偶尔有些第三方框架还是使用的commonJS规范

4.1 如何使用ES6规范

浏览器环境

正常情况下,我们在html中直接可以使用script标签引入我们的js文件

	<script src="./main.js"></script><!-- <script type="application/javascript" src="./main.js"></script> -->

script 标签有一个 type 属性,默认情况为:application/javascript。所以大多数情况都简写了。但是在 ES Module 中,为了告诉浏览器我们是用的 ES Module,需要修改 type属性为 module

	<script src="./main.js" type="module"></script>

NodeJs环境

方式一: .mjs,就是将js文件的后缀名改成.mjs
方式二: 配置项目的 package.json 中的 type 属性为 module

注意:

  • NodeJs的8.9之后的版本,就开始支持 ES6了 ,但是在 13.2 版本之后才开启 默认支持运行 ES Module。所以使用版本在 8.9~13.2 之间的 NodeJs ,执行 ES Module 的 js文件。需要添加配置项 --experimental-modules,开启 默认关闭的 ES Module 支持。

  • 上面是我在文章中看到的,我的理解是只要node版本在13.2以上,不按照上面2种方式也能使用ES 6标准,但是实际操作不行,我的版本是16.18.0,后面还是使用方式二npm init

4.2 严格模式

Es Module 第一个特点:默认开启了严格模式。即便你没有在文件的开头添加 use strict

主要有以下限制:

  1. 变量必须声明后再使用
  2. 函数的参数不能有同名属性,否则报错
  3. 不能使用 with 语句
  4. 不能对只读属性赋值,否则报错
  5. 不能使用前缀 0 表示八进制数,否则报错
  6. 不能删除不可删除的属性,否则报错
  7. 不能删除变量 delete prop,会报错,只能删除属性 delete global[prop]
  8. eval 不会在它的外层作用域引入变量
  9. eval 和 arguments 不能被重新赋值
  10. arguments 不会自动反映函数参数的变化,这个还不理解
  11. 不能使用 arguments.callee
  12. 不能使用 arguments.caller
  13. 禁止 this 指向全局对象
  14. 不能使用 fn.caller 和 fn.arguments 获取函数调用的堆栈
  15. 增加了保留字(比如 protected、static 和 interface)

4.3 实际使用

// mian.js
// 可以用*号全部导入 并起别名
import * as student from './student.js'var studentScore = student.score();
student.skills[0]().then((message) => console.log(message));
console.log(studentScore)
// student.js
// 在没有别的处理的情况下 需要加后缀 .js
// 具体跟搜索有关 后期需要再了解
import { make_food } from "./cook.js";var maths = 80;
var chinese = 90;
var skills = [make_food];
function score() {return maths + chinese;
}
// 批量导出
export { skills, score }
// cook.js
var name = "煮饭";
// 单独导出
export function make_food() {return new Promise(function (resolve, reject) {setTimeout(() => {resolve("煮好饭了")}, 1000);})
}

package.json

{"name": "es6model","version": "1.0.0","description": "","main": "main.js","type": "module","scripts": {"test": "node ./main.js"},"author": "","license": "ISC"
}

注意事项

  1. import 的变量是只读的
  2. import 的变量实际上是对原本模块中变量的引用,也就是说改变原模块变量值,引入的变量值也会改变
  3. 和 export 同理, import 语句不允许放在块级作用域中使用,会直接报错;
  4. 由于ES Module是静态编译,所以 import会被提升到最顶部执行 ;
  5. import 的执行逻辑 优先深度遍历,先子后父,也就是说,会先将一个文件import执行到底,我就不写了,借用博主的代码了,交叉引用的情况也要也要先把子模块全部加载完先
  6. 多次重复执行同一句 import 语句,只会执行一次;
// 第五条的测试
// a.mjs
console.log('a开始执行啦')
// 按理来说上面是要先执行 但是 import会提升
import { say } from './b.mjs'
import { edit } from './c.mjs'
export var a = 1
console.log('a结束了')// b.mjs
console.log('b开始执行啦')
export function say() {console.log('开始说话')
}
import { a } from './a.mjs'
// b中又引用到a 但是这个时候b都还没加载完,所以a模块肯定还没加载完 那么a变量就是个undefined
console.log(a, '----我在这里输出的')
console.log('b结束了')// c.mjs
console.log('c开始执行啦')
export function edit() {console.log('开始编辑')
}
console.log('c结束了')// main.mjs
import { a } from './a.mjs'// b开始执行啦
// undefined ----我在这里输出的
// b结束了
// c开始执行啦
// c结束了
// a开始执行啦
// a结束了

4.4 默认导出

为什么 export default 不使用 var 声明一个变量导出呢?
原因是 export default 可以看做就是输出一个叫做 default 的变量或方法,然后系统允许你为它取任意名字。

/* 模拟 default*/
var a = 1
export {a as default}

4.5 加载文件的顺序

  1. 默认情况

默认情况下,浏览器是同步加载 JavaScript 脚本,即渲染引擎遇到<script>标签就会停下来,等到执行完脚本,再继续向下渲染。如果是外部脚本,还必须加入脚本下载的时间。

2.异步加载

添加属性,defer 或者 async,都会开启异步加载
defer与async的区别是:

  • defer要等到整个页面在内存中正常渲染结束(DOM 结构完全生成,以及其他脚本执行完成),才会执行;
  • async一旦下载完,渲染引擎就会中断渲染,执行这个脚本以后,再继续渲染。
    一句话,defer是“渲染完再执行”async是“下载完就执行”

注意:
另外,如果有多个defer脚本,会按照它们在页面出现的顺序加载,而多个async脚本是不能保证加载顺序的。

  1. 加载文件的逻辑
<script src="xxx.js" defer></script>
<script src="xxx.js" async></script>
  1. <script type="module" src="./foo.js"></script> 加载文件的逻辑

所以 <script type="module" src="./foo.js"></script> 可以理解为,异步加载 ./foo.js 文件,等页面渲染完毕之后再开始执行我们的脚本。

<script type="module" src="./foo.js"></script>
<!-- 等同于 -->
<script type="module" src="./foo.js" defer></script>

参考文章

再苦再累也必须要弄懂的:ES6的ES Module

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/56211.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode做题笔记106. 从中序与后序遍历序列构造二叉树

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 思路一&#xff1a;递归 struct TreeNode* createTreeNode(int val) {struct TreeNode* ret ma…

四信5G工业路由器赋能5G LAN全连接工厂建设

5G作为“新基建”之首&#xff0c;肩负着驱动国民经济转型升级、促进实体经济与数字经济深度融合、满足各行各业高质量通信服务需求的重任。 随着5G技术的更新迭代&#xff0c;各行各业对网络的可靠性&#xff0c;确定性等提出更高的需求&#xff0c;5G LAN作为3GPP R16标准定…

【CSS】网站 网格商品展示 模块制作 ( 清除浮动需求 | 没有设置高度的盒子且内部设置了浮动 | 使用双伪元素清除浮动 )

一、清除浮动需求 ( 没有设置高度的盒子且内部设置了浮动 ) 绘制的如下模块 : 在上面的盒子中 , 没有设置高度 , 只设置了一个 1215px 的宽度 ; 在列表中每个列表项都设置了 浮动 ; /* 网格商品展示 */ .box-bd {/* 处理列表间隙导致意外换行问题一排有 5 个 228x270 的盒子…

如何修改由 img 标签引入的 svg 图片颜色 (react环境)

网上试了好几个方法都不行&#xff0c;问了一下身边同事的处理方法&#xff0c;终于搞定了。话不多说&#xff0c;直接上代码&#xff1a; 此处是 jsx 中的图标引入 <img className{STYLE.contactIcon}onClick{() > {你的一些操作}} style{{WebkitMaskImage: url(${ite…

LibreOffice新一代的办公软件for Mac/Windows免费版

LibreOffice是一款免费、开源的办公软件套件&#xff0c;可在多个操作系统上运行&#xff0c;包括Windows、Mac和Linux。它提供了一系列功能强大的办公工具&#xff0c;包括文档处理、电子表格、演示文稿、数据库管理等。 LibreOffice的界面简洁直观&#xff0c;与其他流行的办…

【力扣每日一题】2023.8.26 汇总区间

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目给我们一个有序数组&#xff0c;让我们把数组内的元素汇总区间&#xff0c;也就是说有一串数字是连续的&#xff0c;比如是 1 2 3 4…

idea启动正常,打成jar包时,启动报错

背景 自己写了个小程序&#xff0c;在idea中启动正常&#xff0c;达成jar包发布时&#xff0c;启动报错。 Caused by: java.sql.SQLException: unknown jdbc driver : at com.alibaba.druid.util.JdbcUtils.getDriverClassName(JdbcUtils.java:517) at com.alibaba.druid.pool…

用AI重构的钉钉,“钱”路在何方?

点击关注 文&#xff5c;郝 鑫&#xff0c;编&#xff5c;刘雨琦 钉钉2023年生态大会&#xff0c;离开了两年的无招&#xff0c;遇到了单飞9天的钉钉。 “做小钉钉、做好钉钉、做酷钉钉”&#xff0c;无招重申了钉钉的方向。 无招提到的三点&#xff0c;再加上“高质量增长”…

工厂模式简介

概念&#xff1a; 工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种封装对象实例化过程的方式&#xff0c;客户端只需要关注接口或抽象类&#xff0c;并由工厂类根据具体需求返回相应的实例。工厂模式将对象的创建与使用分离&am…

Linux下jenkins全量迁移到新服务器

文章目录 1、目的2、迁移1&#xff09;查看jenkins的主目录2&#xff09;登录要迁出的服务器打包3&#xff09;找到对应的war包4&#xff09;登录对应迁入服务&#xff0c;上传war包和打包的jenkins数据等5&#xff09;在新的服务器解压迁入的数据等&#xff0c;并查看端口是否…

vue和react学哪一个比较有助于以后发展?

前言 首先声明vue和react这两个框架都是很优秀的前端框架&#xff0c;使用的人群下载量上数量也是相当的庞大&#xff0c;这篇文章没有贬低或者攻击任何一个框架的意思&#xff0c;只在于根据答主的问题来对这两个框架做出对比&#xff0c;以方便大家更加清晰的了解到当下vue和…

邂逅JavaScript

前言&#xff1a;前端三大核心 前端开发最主要需要掌握的是三个知识点&#xff1a;HTML、CSS、JavaScript 一、认识编程语言 1.计算机语言 前面我们已经学习了HTML和CSS很多相关的知识: 在之前我们提到过, HTML是一种标记语言, CSS也是一种样式语言; 他们本身都是属于计算…

4、Spring之Bean生命周期源码解析(创建)

Spring最重要的功能就是帮助程序员创建对象(也就是IOC),而启动Spring就是为创建Bean对象做准备,所以我们先明白Spring到底是怎么去创建Bean的,也就是先弄明白Bean的生命周期。 Bean的生命周期就是指:在Spring中,一个Bean是如何生成的,如何销毁的。 Bean生命周期流程图…

k3s在线快速安装部署

中文文档&#xff1a;快速入门指南 | K3s 一、k3s父节点安装 设置主机唯一名称 hostnamectl set-hostname 192.168.56.105 开放k3s所需端口 6443 51820 和 51821 在线安装主节点 curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRRORcn…

剑指 Offer 60. n个骰子的点数

剑指 Offer 60. n个骰子的点数 动态规划&#xff1a;已知n-1个骰子的所有情况&#xff0c;再增加一个骰子&#xff0c;可推出n个骰子的所有情况。增加的一个骰子的点数只有1-6种可能&#xff0c;与n-1个骰子对应点数相乘&#xff0c;可得到n个骰子点数的一种情况&#xff0c;遍…

Java学习

程序计数器 Program Counter Register&#xff1a;  记录的是正在执行的虚拟机字节码指令的地址&#xff0c;  此内存区域是唯一一个在JAVA虚拟机规范中没有规定任何OutOfMemoryError的区 域 虚拟机&#xff1a;VM Stack  描述的是 JAVA 方法执行的内存模型&#xff0c;每…

通道洗牌操作

假设我们有一个4通道的2x2的图像(batch size为1)&#xff0c;即b1, c4, hw2&#xff0c;并且我们选择groups2&#xff0c;那么我们将通道分为两组。 给定以下输入x&#xff1a; x [[[1, 2], [3, 4]],[[5, 6], [7, 8]],[[9, 10], [11, 12]],[[13, 14],[15, 16]] ]首先&…

Python第三方库纵览

Python第三方库纵览 知识点 更广泛的Python计算生态&#xff0c;只要求了解第三方库的名称&#xff0c;不限于以下领域: 网络爬虫、数据分析、文本处理、数据可视化、用户图形界面、机器学习、Web开发、游戏开发等 知识导图 1、网络爬虫方向 网络爬虫是自动进行HTTP访问并捕…

数学分析:场论

我们之前知道的是里斯表示定理。 这里看到&#xff0c;对于多重线性映射&#xff0c;里斯表示定理会从内积变成混合积。当然我们还是只考虑三维以内的情况。 于是我们可以把不同的1形式和2形式的下标写上&#xff0c;表示他们相当于内积或者混合积对应的那个向量。 然后还差0形…

怎么把PDF转成Word?需要注意什么事项?

PDF是一种常见的文档格式&#xff0c;但是与Word文档不同&#xff0c;PDF文件通常不能直接编辑。如果您想编辑PDF文件中的文本&#xff0c;或者想将PDF文件转换为Word文档&#xff0c;下面我们就来看一看把PDF转成Word有哪些方法和注意事项。 PDF转Word工具 有许多将PDF转换为…