模块化的意义

  • 对大型网站项目做更细粒度的拆分,团队协作中每个人各司其责负责自己的模块,彼此模块之间不会造成命名空间污染
  • 根据页面组成拆分出不同的子组件
  • 针对不同业务逻辑,抽象出不同的功能模块,供业务方黑盒调用
  • 针对重复的功能和页面元素,开发维护一套公共代码即可完成模块复用,有更高的复用性和可维护性
  • 对于当前页面非必须呈现的模块资源,使用按需加载,提高首屏响应速度

模块化方案比较

  • 在ES6 Modules出现之前主流的模块化方案有CommonJS、AMD、CMD
  • CommonJS方案主要应用于服务端NodeJS,在node环境下原生支持
  • AMD和CMD作为第三方的类库,来解决浏览器端模块化问题,正逐渐被ES6模块化所替代
  • ES6 Modules则是第一次在javascript语言标准层面添加的模块化解决方案

ES6 Modules

与CommonJS的区别

  1. CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用
  2. 静态化,编译时就确定模块之间的依赖关系、输出和引入的变量;CommonJS是在js运行到对应位置时,才会加载确定这些信息
  • CommonJS输出的是一整个对象(即module.exports属性),即使是用不到的属性和变量,一样会被加载引入进来
// CommonJS模块
let { stat, exists, readFile } = require('fs');// 等同于
let _fs = require('fs');
let stat = _fs.stat;
let exists = _fs.exists;
let readfile = _fs.readfile;
复制代码

先加载整个对象,再依次读取需要的三个方法,这种加载称为“运行时加载”

  • ES6 Modules不是输出的不是对象,通过export指定输出的内容,通过import指定引入的内容
// ES6模块
import { stat, exists, readFile } from 'fs';
复制代码

上面代码表示从'fs'模块中只引入三个方法,其他方法不加载。这种加载称为“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载,效率要比 CommonJS 模块的加载方式高

export

常被用来export对外接口格式有:

  • variable变量
  • class对象
  • function函数

错误写法

// 报错
export 1// 报错
var exp = 1;
export exp
复制代码

正确写法: export变量

// 写法一
export var m = 1// 写法二
var m = 1
export {m}// 写法三
var n = 1
export {n as m}
复制代码

export 函数

// 报错
function f() {}
export f// 正确
export function f() {};// 正确
function f() {}
export {f}
复制代码

export default 指定默认输出 实质是指定输出了一个叫default的变量或function

// modules.js
function add(x, y) {return x * y;
}
export {add as default};
// 等同于
// export default add;// app.js
import { default as foo } from 'modules';
// 等同于
// import foo from 'modules';
复制代码

常用用法

// 输出常量
export 1//输出变量
let share = 1export default share//输出函数
function share(){//....
}
export default share//输出匿名函数
export default function(){//...
}
复制代码

import

  • 从模块中引入需要的方法、变量等
// export很多接口时
import { Component } from "react"// export default 指定默认输出时,可以为其指定任意名字
import React from "react"// 重命名
import { Component as AAA } from "react"// 整体加载
import { * as Util} from './util'复制代码
  • import引入的接口是只读的,不允许对其更改
  • import命令是编译阶段执行的,在代码运行之前,所以import命令会被提升到文件顶部,优先执行
//这样写没有任何问题
foo();import { foo } from 'my_module';
复制代码

import()动态加载

前面介绍了,export、import命令是编译时加载这就导致不支持运行时加载才能实现的按需加载功能,所以加入了import()功能,程序运行到import()这里才会加载模块

  • import()返回一个Promise对象
// ../utils 模块有默认输出时
import('../utils').then( module => {// module是模块暴露的默认接口
})// ../utils 模块没有默认输出时
import('../utils').then((moduleA, moduleB,) => {// moduleA、moduleB是对应输出的接口
})
复制代码

转载于:https://juejin.im/post/5c7ca107e51d4560a82bf7a0

关于前端模块化你应该知道的相关推荐

  1. 前端开发也要知道的 DNS

    前端开发也要知道的 DNS DNS是什么 DNS的解析过程 本地DNS服务器配置 DNS的缓存策略分析 浏览器缓存dns策略 chrome浏览器 缓存时间 缓存清理 firefox浏览器 缓存时间 缓 ...

  2. 前端工程师必须要知道的SEO技巧(2):制作比设计还要漂亮的代码(内容和语义化代码)上...

    前言:现在的网站设计,大多数不仅仅要求美观,前端代码往往发挥着重要的作用.这意味着很大一部分搜索引擎优化或搜索引擎优化责任应该落在设计师身上.然而,有大量的网页设计师不理解这个问题以及如何在建立一个网 ...

  3. 前端,你要知道的SEO知识

    大家好,我是若川.三天假期总是那么短暂,明天就要上班了.今天推荐一篇相对简单的文章. 点击下方卡片关注我.加个星标 之前有同学在前端技术分享时提到了SEO,另一同学问我SEO是什么,我当时非常诧异,作 ...

  4. Web前端:你应该知道的5个CSS框架

    ​ CSS 框架近来越来越受欢迎,与所有开发工具一样,CSS框架处于不断发展和改进的状态,因此建议你密切关注现代趋势. 1. Bootstrap 这个框架被认为是最好的响应式 CSS 框架.它专为前端 ...

  5. 每个前端开发者都应知道的25个实用网站

    微信搜索 [大迁世界], 我会第一时间和你分享前端行业趋势,学习途径等等. 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整 ...

  6. [面试专题]前端需要知道的web安全知识

    前端需要知道的web安全知识 标签(空格分隔): 未分类 安全 [Doc] Crypto (加密) [Doc] TLS/SSL [Doc] HTTPS [Point] XSS [Point] CSRF ...

  7. 达内html5是什么,Web前端工程师应该知道的HTML5相关知识有哪些

    今天小编要跟大家分享的文章是关于Web前端工程师应该知道的HTML5相关知识有哪些?随着互联网技术的快速发展,人们对互联网的使用越来越大,对于界面和用户体验的要求越来越高.因此Web前端越来越火,前端 ...

  8. 知乎高赞:前端模块化的十年征程

    作者:@外婆的https://zhuanlan.zhihu.com/p/265632724 前言 夫以铜为镜,可以正衣冠:以史为镜,可以知兴替 --<旧唐书·魏徵传> 也许在谈论具体的内容 ...

  9. Vue 开发必须知道的 36 个技巧【近1W字】

    前言 Vue 3.x 的Pre-Alpha 版本.后面应该还会有 Alpha.Beta 等版本,预计至少要等到 2020 年第一季度才有可能发布 3.0 正式版; 所以应该趁还没出来加紧打好 Vue2 ...

  10. 你应该知道的25个非常有用的CSS技巧

    在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼容性的问题, CSS网页布局,说难,其实很简单.说它容易,往往有很多问题困扰着新手,在中介绍了非常多的技巧,这些小技巧与知 ...

最新文章

  1. python捕获异常后处理_python异常捕获处理
  2. 专访小邪:从十年技术之路看阿里技术体系的变革
  3. 福利 | 16场精选活动干货、精华笔记、课件分享:数据派独家讲座干货大合集
  4. 王树彤IT美女七年磨一剑
  5. sessionId与cookie 的关系(百度文库)
  6. LeetCode MySQL 1587. 银行账户概要 II
  7. python split 正则_Python 正则表达式:split
  8. [Java] 蓝桥杯 BASIC-4 基础练习 数列特征
  9. log4j容器初始化探究
  10. python英语培训_学习Python语言一定要英语好嘛?
  11. 在谷歌chrome、Firefox等浏览器打开、编辑、保存微软Office、金山WPS文档
  12. java 多线程 面试题整理(更新......)
  13. zktime 协议_zktime5.0考勤管理系统使用说明书(1.0版).pdf
  14. 【基于物理的渲染(PBR)白皮书】(三)迪士尼原则的BRDF与BSDF相关总结
  15. This Week in Spring - July 9, 2013
  16. 一周技术学习笔记(第58期)-如何突破第四章障碍
  17. vue如何调用高德地图
  18. python实现简单图书管理系统
  19. iOS-AFNetworking3.0 使用
  20. 用ios企业证书发布ipa到服务器上扫码下载

热门文章

  1. 关于socket中阻塞,非阻塞,同步,异步的概念
  2. QCon杭州2012技术开发大会感受
  3. 怎样关闭eclipse中的tooltip提示
  4. 第六章 函数逼近-强化学习理论学习与代码实现(强化学习导论第二版)
  5. 【GIS导论】实验二 数据采集
  6. 线性回归之最小二乘法——收藏
  7. java的继承实例_Java 继承方法实例详解
  8. chrome如何调试html,如何用firefox或chrome浏览器调试js和jquery程序
  9. c语言 sizeof(unsign),C语言基础知识
  10. JDK动态代理与CGLIB的区别