模块化开发入门

模块化概述

模块化是当下前端最重要的开发范式之一。
把复杂的代码进行模块化提高开发效率。
在这里插入图片描述
在这里插入图片描述

模块化演变过程

早期前端没有预料到到现在能发展成这种规模,遗留了很多问题。
最开始是把数据分成模块

阶段一

在这里插入图片描述
调用
在这里插入图片描述
缺点:
在这里插入图片描述

阶段二

包裹成一个对象的方式
在这里插入图片描述
使用
在这里插入图片描述

阶段三

使用立即执行函数 提供模块的私有空间
在这里插入图片描述
在这里插入图片描述

阶段四

开始实现依赖关系
在这里插入图片描述

模块化规范的出现

在这里插入图片描述
在这里插入图片描述node提供的标准

在这里插入图片描述
在这里插入图片描述
但是commonjs在浏览器中使用会有些问题。因为每次页面加载都会同步大量请求。

AMD

在这里插入图片描述
专门为浏览器设计的一种规范,而且还推出了一个叫require.js的库
在这里插入图片描述
在这里插入图片描述
加载模块
在这里插入图片描述
缺点
在这里插入图片描述

来看看淘宝的 sea.js + CMD

在这里插入图片描述

模块化标准规范

正题

上面介绍的演变过程都有些问题和缺点,如今的模块化标准基本统一。
在这里插入图片描述
最开始的ES modules没有被现代浏览器支持,随着webpack的出现才慢慢解决。
相比社区提出来的AMD,ESmodule更强大。

ES Modules 特性

使用
在这里插入图片描述
在这里插入图片描述
4.延迟演示
只有脚本执行完成(渲染完后)才开始加载
在这里插入图片描述
点击后
在这里插入图片描述
上面和defer属性效果一样
在这里插入图片描述
在这里插入图片描述

ES Modules 导出

在这里插入图片描述
这里使用 broswer sync测试
在这里插入图片描述
1.多个导出
在这里插入图片描述
2.批量导出
在这里插入图片描述
3.别名导出,导入时必须用别名
在这里插入图片描述
注意 name as default的话 会作为这个模块默认导出,导入时就必须这样
在这里插入图片描述
导入也可以起别名
在这里插入图片描述
4.默认导出
在这里插入图片描述
导入的时候 名字就可以随便取了

ES Modules 导入导出的注意事项

在这里插入图片描述
不带default是导出变量
在这里插入图片描述
导出的是一个内存空间,不是复制了一份,这是和node commonjs中是不同的2.而且暴露出去的是只读的,只能在内部修改
在这里插入图片描述
在这里插入图片描述
2不能外部修改,导入的模块默认为常量

在这里插入图片描述

ES Modules 导入用法

1.必须要完整命,这和commonjs不同
在这里插入图片描述
2必须完整路径
在这里插入图片描述
后期用打包工具是可以省略这些扩展名的。
3.必须./开头 还可以换其他俩种导入方法
在这里插入图片描述
4.如果导入为{} 那么不会提取任何对象,会执行(加载这个模块但不提取)
在这里插入图片描述
简写
在这里插入图片描述
4 提取所以导出的属性,把导出的属性以as的方式变为一个对象
在这里插入图片描述
5 动态获取import 路径
在这里插入图片描述
6 导出默认的同时 导出其他成员
在这里插入图片描述
方式2
在这里插入图片描述

ES Modules 导出导入成员

在这里插入图片描述
需要把较多的模块统一导出时候用会很方便
注意:(如果子模块导出的是default,那么导入的时候必须使用as 重命名)
在这里插入图片描述

ES Modules 浏览器环境 Polyfil

因为ESM是14年提出的,早期的浏览器不可能会支持,可以用下面的js文件解决,此文件支持绝大多数特性
在这里插入图片描述
这是个npm模块,那么我们可以通过 unpkg.com 这个网站提供的cdn服务获取
域名+文件名 回车
在这里插入图片描述
删除dist后面的 回车 (记得要带/不然走默认文档说明
在这里插入图片描述
点进去
在这里插入图片描述
拷贝链接在这里插入图片描述
其实这个原理就是先用babel读出来然后将不识别的ESM转换,使得特性可以正常工作。
打开ie发现还不行,报promise为实现的error
解决:继续下载一个promise的polyfill,继续去cdn拿
在这里插入图片描述
正常打印,也就是ESM可以正常工作了
在这里插入图片描述
这又有个问题,如果在支持ES6的浏览器中,会被执行俩次(因为本身ESM会执行一次,然后ESMloader的polyfill又会执行一次
在这里插入图片描述
解决:利用script的新属性解决,添加后只会在不支持esm的浏览器中工作 (生产环境千万别用,因为是动态分析会特别慢
在这里插入图片描述
只有ie弹出了alert
在这里插入图片描述

ES Modules in Node.js - 支持情况

esm作为JS标准,会逐渐统一JS应用标准,node8.5后都支持esm了
修改扩展名msj,这个时候会提示是否修改路径,选no
在这里插入图片描述
运行,加上参数表示启用esm的实验特性
在这里插入图片描述
在这里插入图片描述
尝试提取系统内部模块的成员
这个是可以的
在这里插入图片描述

ES Modules in Node.js - 与 CommonJS 交互

如何在ESM中载入COMJS模块在这里插入图片描述
也可以用exports.foo这种别名导出

在这里插入图片描述

注意,COMJS默认导出的是默认成员,所以导入的时候注意
在这里插入图片描述

ESM导出COMJS导入

node环境不支持,但是webpack打包环境中是可以的
在这里插入图片描述
总结
在这里插入图片描述

ES Modules in Node.js - 与 CommonJS 的差异

在这里插入图片描述
require exports module可以用esm中的 import export代替
对于_filename _dirname这俩个变量 可以通过
在这里插入图片描述

ES Modules in Node.js - 新版本进一步支持

在这里插入图片描述
也就是说不用将扩展名改为mjs了
在这里插入图片描述
在这里插入图片描述
将COMJS的文件改名为cjs扩展名,这样就可以用了
在这里插入图片描述

ES Modules in Node.js - Babel 兼容方案

处理早期node版本兼容,使用babel去兼容
node低版本中使用esm
在这里插入图片描述
在这里插入图片描述
原因
babel是基于插件转换的,babel本身不转换
在这里插入图片描述
在这里插入图片描述
解决:命令中后面跟个preset参数就可以了
在这里插入图片描述
觉得跟参数麻烦的可以
在这里插入图片描述
转换的是插件不是preset preset是一个集合

实验

移除preset
在这里插入图片描述
具体使用单个插件试试转换
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
运行成功!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值