JavaScript模块化历程(二)

JavaScript 模块化 了解了一下js模块化,简单记录一下。参考资料: JavaScript 模块化历程 前端模块化模块化发展历程 js一开始并没有模块化的概念,直到ajax被提出,前端能够像后端请求数据,前端逻辑越来越复杂,就出现了许多问题:全局变量,函数名冲突,依赖关系不好处理。 当时使用子执行函数来解决这些问题,比如经典的jquery就使用了匿名自执行函数封装代码,将他们全都挂载到全局变量jquery下 阅读详情

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

涨薪技术|Kubernetes(k8s)环境部署实战 这两者都是在/etc/docker/daemon.json里修改的,所以我们一起配置了就好了,首先执行下述命令编辑daemon.json:​​​​​​​。安装完成后,可以使用以下命令来查看dashboard访问的端口号​​​​​​​。网络插件CNI也是以容器的方式进行启动​​​​​​​。安装完成后可以检查是否拉取了对应的容器​​​​​​​。再使用以下命令进行安装:​​​​​​​。打开后输入以下内容:​​​​​​​。安装1.19.0版本​​​​​​​。修改IP地址:​​​​​​​。 阅读详情

相关推荐

从官方例程到实战:AXI Memory Mapped To PCIe 核在FPGA-RC模式下的配置与调试全解析

本文详细解析了AXI Memory Mapped To PCIe核在FPGA-RC模式下的配置与调试方法。从IP核基础结构到实战参数设置,再到例程代码剖析和调试技巧,全面覆盖了AXI与PCIe协议转换的关键技术点,帮助开发者高效实现FPGA与PCIe设备的高速数据交互。

weixin_42550597的博客 267

Vite总结

概要 Vite是一个基于浏览器原生ES imports的开发服务器。开发环境利用了浏览器原生支持模块化特性,浏览器解析imports,服务端按需编译返回内容,跳过打包过程。生产环境内置rollup实现打包构建。其特点如下: 快速冷启动 瞬间热更新 真正的按需加载和按需编译 使用 Vite默认搭配vue使用,但是也可以搭配react等其他框架。注意:开发环境下需要使用支持 native ES module imports的浏览器。 // 默认使用Vue框架 npm init vite-app <p

weixin_49766444的博客 2465

《Arduino与LabVIEW开发实战》第2章 LabVIEW基础

第2章 LabVIEW基础 2.1 LabVIEW与虚拟仪器 2.1.1 什么是虚拟仪器 仪器仪表发展方向有很多,其中一个重要方向是将计算机和仪器结合起来。具体来说有两种方式,一种是将微处理器或微控制器嵌入到仪器中,构建智能化的内含嵌入式系统的仪器仪表,这是嵌入式仪器;另一种是将仪器装入计算机中,以通用计算机硬件及操作系统为载体,外配数据采集卡等外部设备,通过编制不同功能的程序,以实现多种仪...

jxgy01的博客 490

script 标签 <script type=“module“>

一开始都是社区, 前端圈的大佬们自己实现模块化, 比如seajs, nodejs使用的CommonJS规范, 以及异步模块定义 AMD,官方的ES6 Module, 同时ES6 Module也是我们目前前端工程化开发中运用最广泛的模块化规范。在script标签中写js代码,或者使用src引入js文件时,默认不能使用module形式,即不能使用import导入文件,但是我们可以再script标签上加上type=module属性来改变方式。

ikkkp的博客 5371

UNet改进(6):基于注意力机制的多尺度医学图像分割方法

本文提出了一种集成多尺度注意力机制的UNet改进模型UNetWithAttention,用于提升医学图像分割性能。该模型在标准UNet架构基础上,设计了并行3×3、5×5、7×7卷积核的多尺度注意力模块,通过特征拼接和Sigmoid激活生成注意力权重,实现了对不同尺寸病变的自适应关注。模型采用分离式设计,将特征提取与特征选择解耦,在编码器-解码器各阶段嵌入注意力模块。实验表明,该方法在视网膜血管分割和肺结节检测任务中优于标准UNet,Dice系数和IOU分别提升2.6%和4.1%,同时保持计算效率。

2501_91516851的博客 1324

国科大学习资料--计算机网络--历年考题1

国科大学习资料–计算机网络–历年考题1 1、假定有一个通信协议,每个分组都引入100字节的开销用于头和成帧,现在使用这个协议发送1M字节的数据(为方便计算,1M=10^6),然而在传递的过程中有一个字节被破坏了,因而包含该字节的那个分组被丢弃并重传。(1)当数据的分组大小为1000、5000、20000和40000字节时,计算相应(包括开销)的传递字节总数目。(2)计算分组大小的最优值是多少,即分组的大小为何值时总的传输字节数最少。(提示:最优值不是1000、5000、20000和40000字节中的一个)

无名何许人的博客 1180

深入理解现代前端开发中的 <script type=“module“> 与构建工具实践

深入理解现代前端开发中的 <script type="module"> 与构建工具实践

ttod的博客 1079

【软考高级系统架构论文】论微服务架构及其应用

本文围绕“论微服务架构及其应用”展开论述。首先概要介绍了本人参与的某公司线上电子商务平台项目,在其中担任系统架构设计师。接着分析了微服务架构相较于单块架构的特点,如模块化与组件化、技术栈多样性、独立部署与扩展、高度容错与可用性等。最后结合项目阐述了软件架构对微服务模式的采用情况,以及实施过程中遇到的问题及解决方案,如服务划分粒度、数据一致性、监控与故障排查等问题,并给出了相应解决办法。

qq837993702的博客 225

JavaScript模块化使用及详解

JavaScript没有模块化一直是它的痛点,所以才会产生我们前面学习的社区规范:CommonJS、AMD、CMD等, 所以在ES推出自己的模块化系统时,大家也是兴奋异常ES Module和CommonJS的模块化有一些不同之处: 一方面它使用了import和export关键字;另一方面它采用编译期的静态分析,并且也加入了动态引用的方式import负责从其他模块导入内容;了解:采用ES Module将自动采用严格模式:use strict。

weixin_51629637的博客 1108

深度解析:LPDDR5 采样 Mask 背后的秘密 —— 从 Jitter 到 BER 全面剖析

在 LPDDR5 中,CK/DQS 信号相当于“指挥棒”,而数据(DQ)要在时钟节拍里被准确采样。Crosspoint Mask 区域横轴:时间 (Time)纵轴:电压 (Vref)👉 只要采样点落在这个区域内,数据就是正确的。否则就会出错。BERPBERPMask 就像高速公路的收费站口,如果车(采样点🚗)在车道内,顺利通过;一旦跑偏,就撞护栏。LPDDR5 的速率极高,UI 非常短,Mask 区域成为核心指标各种 Jitter、Noise 会不断压缩 Mask。

weixin_43199439的博客 354

构建OneService:打造高效、安全、灵活的企业级数据服务平台

数据服务(OneService)作为统一的数据服务出口,实现了数据的统一市场化管理,有效地降低数据开放门槛的同时,保障了数据开放的安全。

数据与算法架构提升之路专栏 2106

<script type=“module“>用法的基本介绍

更好的代码组织- 模块化架构明确的依赖关系- 静态分析支持作用域隔离- 避免全局污染现代特性支持- 顶层await、动态导入等开发体验提升- 结合Vite等工具实现快速HMR对于新项目,强烈推荐使用ES模块作为标准开发方式。

黄彪博客 1791

OpenClaw(Clawdbot/Moltbot)如何正确的配置浏览器,实现对浏览器的自动化操作功能(浏览器状态为running:false怎么办)

OpenClaw(Clawdbot/Moltbot)浏览器自动化功能无效?🤖 本文详细介绍如何解决这个问题🔧,让你的OpenClaw(Clawdbot/Moltbot)真正具备"睁眼看世界"的能力,支持网页搜索、点击操作和截图等功能 ✅

XiaoqiangClub的博客 8105

[ 模块化 ] JS 模块化发展历程

JavaScript 模块化的发展

李赛赛的专栏 924

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

JS模块化发展历程(初稿)

这是最最最简单的模块化,也是最最最基础的模块化,你可以在 jquery 中看到它的身影,你甚至在 webpack 中配置打包方式设置为 "IIFE" 时,你打包出来的代码也是这样的格式,它简单但也很流行。但计算机硬件的发展,用户的电脑越来越好,业务人员希望网页能够实现越来越复杂的功能,开发人员也愿意为此付出劳动,随着业务逻辑日趋复杂,简单的JS无法再满足人们的需求,于是模块化需求日益增长。普通(不加参数):同步下载,下载文件,解析文件,执行后续代码。,下载文件,执行后续代码,待DOM解析完成,再解析文件。

wsx19940315的博客 1383

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

js模块化历程

这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生与变迁,展望ES6模块化标准的未来。经历过这段历史的人或许会感到沧桑,没经历过的人也应该知道这段历史。 无模块时代 在ajax还未提出之前,js还只是一种“玩具语言”,由Brendan Eich花了不到十天时间发明,用来在网页上进行表单校验、实现简单的动画效果等等,你可以回想一下那个网页上到处有公告块飘来飘去的时代。 这个时候...

lin123_00的博客 192

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JavaScript模块化开发的演进历程

JavaScript模块化开发的演进历程

IronKee的博客 1656

模块化的发展历程

JS模块化 模块化的理解 非模块化的问题 模块化的优点 模块化的发展历程 模块化规范 AMD : 浏览器端 CMD : 浏览器端 ES6模块化 总结 AMD和CMD区别: JS模块化 @(工程化和项目管理) 模块化的理解 什么是模块? 将一个复杂的程序依据一定的规则(规范)封装成几个块(文件), 并进行组合在一起; 块的内部数据/实现是私有的, 只是向外部暴露一些接口(方法)与外部其它模块通信;...

li123128的博客 1295

【JavaScript】深入理解模块化

简单来说,模块就是把一个复杂的程序按照特定规则(规范)拆分成多个独立的块(文件),然后再组合在一起。模块内部的数据和实现细节是私有的,仅通过向外暴露的接口(方法)与其他模块进行通信。这就好比一个工厂,工厂内部的生产流程和原料是保密的,但会通过特定的渠道将生产好的产品供应给其他地方使用。

科技改变世界,技术驱动未来。 1028

js 模块化历程

作者:吕大豹 网址:http://www.cnblogs.com/lvdabao/p/js-modules-develop.html  这是一篇关于js模块化历程的长长的流水账,记录js模块化思想的诞生与变迁,展望ES6模块化标准的未来。经历过这段历史的人或许会感到沧桑,没经历过的人也应该知道这段历史。  无模块时代  在ajax还未提出之前,js还只是一种“玩具语言”,由Brendan...

数通畅联 113

js 模块化规范的发展历程

模块化的发展历程 按照诞生时间的先后顺序 CommonJs,2009年1月 AMD Asynchronous Module Definition, 2011年2月 CMD Common Module Definition, 2011年4月后 UMD Universal Module Definition, 2014年9月 ESM EcmaScript Module, 2016年5月 CommonJs 模块规范 第一阶段: Modules/1.0, 产物 browserify 第二阶段: Module

vavid的专栏 432

一文搞懂 JavaScript 模块化

本文介绍了 JavaScript 中主要模块方案和其背后的原因,希望对您有帮助,在日后的工作中看到任何模块,都不再困扰。

weixin_45727472的博客 1734

JavaScript 模块化演进:从 IIFE 到 ES Module 的完整历程

JavaScript 模块化的演进历程是一部精彩的技术发展史。从最初的全局变量污染,到现在的 ES Module 原生支持,我们见证了前端工程化从无到有、从简单到复杂的过程。

wuhen_n的博客 1339

JavaScript进阶: 1.4 JS模块化详解

JS-模块化

前端进阶高级/后端进阶中级/AI进阶应用层/未来AI全栈工程师/独立开发者 956
上一篇: JavaScript模块化历程(一)
大大的水壶
博客等级 码龄11年 2粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值