• 视频:https://www.bilibili.com/video/av79663759

文章目录

  • # why ?
  • # 开发模块管理引擎
    • ## (手写) 简单的 模块管理
  • # 使用:export / import ... from ...
  • # 模块的延时加载
  • # 默认是 严格模式
  • # 模块的 作用域
  • # 模块的(预解析)的必要性
  • # 具名导出、导入
  • # 批量导入与建议
  • # 别名
  • # 默认导出 default
  • # 规范 - 推荐
  • # 模块合并导出
  • # 按需动态加载 - import()、Promise 对象
    • ## Promise 对象
    • ## 按需加载 【实现】

# why ?

不同功能封装成独立的文件
只开放部分功能性接口

代码复用
避免命名冲突
解耦(可管理)

# 开发模块管理引擎

市场上的 模块管理引擎:
AMD require.js
CMD sea.js
COMMONJS NODE.js
UMD

## (手写) 简单的 模块管理

  • moduleList - 容器、管理模块
  • define - 定义模块
  • @param {String[]} modules 依赖模块
    let module = (function() { const moduleList = {} ; // 容器/*** @description 模块管理* @param {String} name 名字* @param {String[]} modules 依赖的模块* @param {Function} action 执行的方法* @return 开放接口*/function define(name, modules, action) { // 初始化modules.forEach((m,i)=> {modules[i] = moduleList[m]});moduleList[name] = action.apply(null,modules) ;// 往容器里面压模块}return {define} ;})();module.define('hd', [], function() { // 导出return {first(arr) {return arr[0] ;},max(arr, key) {return arr.sort((a, b) => b[key]-a[key])[0];}};})module.define('lesson', ['hd'], function(hd) { // 导入let data = [{name:'js', price: 99, click: 4} ,{name:'mysql', price: 222, click: 2} ,{name:'vue.js', price: 300, click: 3} ,]let max = hd.max(data, 'price') ;console.log(max)})

# 使用:export / import … from …

通过 以下命令,就实现了 模块的 定义、导出、导入

module.js 文件
export 指定 导出哪些接口

let title = '后盾热' ;
let url = 'www.baidu.com'
export {title}

.html 文件

import 指定 导入哪些接口
from 指定从那里导入 (必须指定明确的路径,否则不能识别。只有到了用打包工具的时候,打包工具才能比较智能的识别)

  <script type="module">import {title} from './module.js' ;console.log(title)</script>

注意:
script 标签需要 加上 type='module'

<script type="module">
...
</script>

# 模块的延时加载

只要 script 加了 type=‘module’
那么这个标签就是延时加载的

即便脚本放在了body上面,仍然能找到body 内容(看下面)

let a = document.querySelector('button') ;
console.log('module' , a) ;
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<script type="module">let a = document.querySelector('button') ;console.log('html' , a) ; import {} from "./module.js"
</script>
<body><button>后盾人</button>
</body>
</html>

# 默认是 严格模式

模块默认是 严格模式 'use strict'

<script type="module">site = 'aa' // 非严格模式下,是不报错的
</script>

# 模块的 作用域

非模块标签内的变量是定义在全局的(下图)

模块标签的作用只在模块标签内部(下图)

# 模块的(预解析)的必要性

模块的导入,只有在 第一次 导入的时候才会解析数据。
避免了重复初始化

(下图)

  <script type="module">import {} from "./module.js" ;import {} from "./module.js" ;import {} from "./module.js" ;import {} from "./module.js" ;import {} from "./module.js" ;</script>

module.js

class Common {init() {console.log("初始化")}
}
new Common().init() ;

同样的,如皋导入的模块导入已导入的模块,也不会再次出发编译(绕?就对了)
(下图)

  <script type="module">import {} from "./module.js" ;import {} from "./module1.js" ;</script>

module.js

class Common {init() {console.log("初始化")}
}
new Common().init() ;

module1.js

import {} from "./module.js" ; // 导入 上面模块
console.log('module-1')

(下图)可以看到,module.js 模块只初始化一次

# 具名导出、导入

具名导入(具体名字导入)

直接在属性、方法前加 export 导出

或者 在最后具名导出

也是能用的

# 批量导入与建议

  <script type="module">import * as api from "./module.js" ;console.log(api)</script>
let site = 'www.baidu.com' ;
function show() {console.log('show')
}
class Common {init() {console.log("初始化")}
}
new Common().init() ;export {site, show , Common}

建议:
使用具名导入

  1. 导入体积小
  2. 代码清晰

# 别名

  <script type="module">import {site as s}  from "./module.js" ; // 导入时候别名let site = 'www.bilibili.com' ;console.log(s)</script>
let site = 'www.baidu.com' ;
function show() {console.log('show')
}
class Common {init() {console.log("初始化")}
}
new Common().init() ;export {site, show as s , Common} // 导出时候别名

# 默认导出 default

默认导出,import 就不用加花括号 {...}

但是,只能有一个

  <script type="module">import s  from "./module.js" ; // 或者 import {default as s, site } from "./module.js"// 或者 import s , {site} from "./module.js" ;s()</script>

导出可以是(下图)

let site = 'www.baidu.com' ;
function show() {console.log('show')
}
class Common {init() {console.log("初始化")}
}
new Common().init() ;export {site, show as default , Common} // 默认导出 show

也可以是(下图)

let site = 'www.baidu.com' ;
export default function  show() { // 默认导出 showconsole.log('show')
}
class Common {init() {console.log("初始化")}
}
new Common().init() ;export {site, show  , Common}


如果批量导出 , 用 default 的 默认导出 需要这样调用(下图)

# 规范 - 推荐

导出 名尽量和 文件名 相关

# 模块合并导出

为了管理方便,弄一个专门的模块作为入口
管理其他模块

m13.2.js

let url = 'www.baidu.com-2'
function show()  {console.log(url) ;
}
class User {}
export {url, show, User as default}

m13.1.js

let url = 'www.baidu.com-1'
function show()  {console.log(url) ;
}
class User {}
export {url, show, User as default}

m13.index.js

import * as m131 from "./m13.1.js"
import * as m132 from "./m13.2.js"
export{ m131, m132}
  <script type="module">import * as api from "./m13.index.js" ;api.m131.show() ;api.m132.show() ;console.log(api.m131.default)console.log(api)</script>

# 按需动态加载 - import()、Promise 对象

之前 import ... from ... 的模式 , 必须在顶层

否则报错(下图)

## Promise 对象

ES6 标准

import() 函数 返回一个 Promise 对象

Promise 对象有个 then 方法,当模块加载完成,进行回调
(如下)

./m13.1.js

let url = 'www.baidu.com-1'
function show()  {console.log(url) ;
}
class User {}
export {url, show, User as default}

使用 import

    import('./m13.1.js').then(module => {console.log(module)})

接收的 module 对象就是 模块对象

## 按需加载 【实现】

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<body><button>点击,后加载</button>
</body><script type="module">document.querySelector('button').addEventListener('click',() => {import('./m13.1.js').then(({url, site}) => {console.log(site,url)});})</script>
</html>

m13.1.js 模块

console.log("按需加载")
let site = 'www.baidu.com'
let url = 'www.bilibili.com'
export {site,url}

JS - 13 - 模块化相关推荐

  1. Node.js模块化开发||Node.js中模块化开发规范

    JavaScript开发弊端 a.js b.js JavaScript在使用时存在两大问题,文件依赖和命名冲突. 生活中的模块化开发 软件中的模块化开发 app.j user.一个功能就是一个模块,多 ...

  2. node js的模块化的分类

    一.node js的模块化的分类: (1)系统模块 (2)自定义模块 二.对外输出: 对外输出东西--必须加给exports (1)单个输出: exports.xxx=??; exports.xxx= ...

  3. 基于Ext JS的模块化应用框架搭建及开发

    Ext JS模块化开发 早期基于Ext JS的Web开发方式,是在HTML中引入JS和CSS文件,典型的就是引入 ext-all.js 这样的文件.ext all 包含的内容很多, 有基本的核心组件. ...

  4. 【Node学习】—Node.js中模块化开发的规范

    [Node学习]-Node.js中模块化开发的规范 Node.js 规定一个JavaScript就是一个模块,模块内部定义的变量和函数默认情况下在外部无法得到 模块化内部可以使用exports对象进行 ...

  5. 腾讯回应 QQ 被工信部通报;由微软老兵领导,Facebook 开发新操作系统;Node.js 13.4.0 发布 | 极客头条...

    整理 | 屠敏 快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注 ...

  6. 支付宝招“找茬”程序员,年薪无上限;谷歌宣布实现“量子霸权”;node.js 13.0.3 发布 | 极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

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

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

  8. vue each_Vue.js从零开始——模块化项目(2)

    今天更新晚了点,因为刚刚去参加面试回来:不多说废话了,今天主要看的是路由,当然因为 Vue Router 本身已经可以写很多内容了,所以我倾向于把基础内容放在这里,路由单开一部分来详细看看. 1 简单 ...

  9. 利用JS面向对象+模块化封装集AJAX请求、基本数据校验、URL参数截取等功能于一身的通用工具模块

    以下为封装好的工具类代码,使用方法将在后边介绍. /*** Created by xiaoqiang on 2017/11/09.*/ 'use strict'; import $ from 'jqu ...

最新文章

  1. Node.js 切近实战(八) 之Excel在线(文件权限)
  2. asp.net core在linux进行上传视频ffmpeg截图
  3. 【uni-app】H5中使用videojs播放器播放视频
  4. 【HDU - 4781】Assignment For Princess(图上构造)
  5. JS 学习笔记--11---内置对象(Global/Math)
  6. 2017.3.12 lzy 测试
  7. c++向量和数组的区别_Matlab入门基础知识(5)对数组的操作
  8. 上采样层什么意思_佛前上三柱香、磕三个头是什么意思!
  9. JavaScript: The Good Parts 学习随笔(三)
  10. Android 11.0 12.0拨打接听电话默认开启免提
  11. 这个游戏引擎开源了!
  12. 零基础学习 自动化编程- 第一天 计算机语言
  13. 主流的商业智能BI工具推荐,学会数据分析没难度
  14. 公开数据集分享(一)-MMWHS
  15. 使用overleaf或Latex时,表头两行合并
  16. 如何在计算机中打开显卡,windows系统如何打开显卡的硬件加速呢?
  17. python k线斜率计算公式_python – 计算Numpy(或Scipy)中的斜率
  18. 阿里云视频点播播放出错,控制台访问出现code:4400
  19. 国科大移动互联网技术考试
  20. 配置Tree Shaking来减少JavaScript的打包体积

热门文章

  1. 微信小程序-上传多张图片加进度,持续修正中……
  2. Python 中隐藏的彩蛋们
  3. yum https ssl双向认证 证书申请
  4. 非激活窗口(Inactive Window)
  5. Transformer Fusion for Indoor RGB-D Semantic Segmentation非官方自己实现的代码
  6. SLAM——之G2O函数库
  7. Linux——磁盘Part 4:磁盘阵列(raid0、raid1、raid5、raid6、raid1+0)
  8. 【BZOJ4864】【BJWC2017】神秘物质 - Splay
  9. 经济-一文看懂经济学进化史:经济学的四次革命
  10. . : 无法加载文件 C:\Users\1\Documents\WindowsPowerShell\profile.ps1