前端模块化开发

随着前端应用的不断复杂,我们不得不花大量的时间去管理。模块化呢,就是一种最主流的代码组织方式。它通过把我们的复杂代码,按照功能的不同,划分为不同的模块,单独维护。提高我们的开发效率,降低维护的成本。

模块化的演变过程

  1. 文件划分,建立不同模块的文件夹
  2. 缺点是污染全局作用域
  3. 命名冲突
  4. 早期模块化完全依靠约定
  5. 命名空间方式
  6. 可以解决命名冲突的问题,但是依然可以访问模块成员被修改
  7. 模块中的依赖关系也没有得到解决
  8. IIFE(立即执行函数)
  9. 将模块中的成员放在一个私有函数里
  10. 实现了私有成员的概念
  11. 有清晰的依赖关系

早期在没有工具和规范的情况下,我们采用以上对模块化的落地方式

模块化规范的出现

  • 模块化标准 + 模块加载器
  • CommomJS规范(早期前端没有使用这个规范)

-- 一个文件就是一个模块

-- 每个模块都有单独的作用域

-- 通过module.exports导出成员

-- 通过require函数加载模块

  • CommonJS是以同步的方式加载模块
  • AMD(Asynchronous Module Definition )

-- 异步的模块定义规范

-- Require.js 实现了这个规范,它是一个强大的模块加载器

AMD使用起来相对复杂

模块化标准规范

  • 最佳实践:

在node.js中使用CommomJS规范

在浏览器中使用ES Modules规范


ES Modules基本特性:

  1. 自动采用严格模式,忽略“use strict”
  2. 每个ES Module 都是运行在单独的私有作用域中
  3. 它是通过CORS的方式请求外部js模块的
  4. scrpt标签会延迟执行脚本,相当于添加了一个defer属性

1、导入和导出:

import {name,hello} from './module.js'export {name}export function hello(){console.log('hello')
}

-- 重命名:

import {name as username} from './modules'export {username as name}

--在使用中常遇的一些问题:

  1. import {name, age} 并不是解构语法,而是一种固定的语法
  2. export{name, age} 并不是字面量对象,而是一种固定的语法
  3. export 导出的并不是值,而是内存地址
  4. import导入的成员是只读的,并不能够修改
  5. import 导入模块的用法和注意事项

(1)文件路径

​ -- 必须要有完整的文件名称

​ -- 相对路径中的 ./ 是不能省略的

​ -- 可以使用绝对路径,或者完整的url

​ (2)加载这个模块,但不提取它:

import {} from './module.js'// 或者import './module.js'

我们在导入一些不需要外界控制的子功能模块时会非常有用

​ (3)提取所有成员:

import * as mod from './module.js'

​ (4)动态的加载模块

​ -- import 只能出现在最顶层,不能嵌套在if或者函数当中

​ -- import函数可以帮助我们完成动态导入:

import('./module.js').then(function(module){console.log(module)
})

​ (5)同时导入命名成员和默认成员

import {name,age,default as title} from './module.js'// 简化import title,{name,age} from './module.js'


  • 直接导入导出成员
 import {Button} from './button.js'import {Avatar} from './avatar.js'   exprot {Button,Avatar}// 简化
export {Button} from './button.js'   export {Avatar} from './avatar.js' 

ES Modules兼容性问题

  • ES Modules in Node.js -与 CommonJS 交互

-- ES Modules中可以导入CommonJS模块

-- CommonJS中不能导入ES Modules模块

-- CommonJS始终只会导出一个默认成员

-- 注意:import不是解构导出对象

  • ES Modules in Node.js 与 CommonJS 的差异
// CommonJS
// 加载模块函数console.log(require)// 模块对象console.log(module)// 导出对象别名console.log(exports)// 当前文件的绝对路径consoel.log(__filename)// 当前文件所在目录console.log(__dirname)
// ES Modules
// 加载模块函数import// 模块对象import module from './module.js'
console.log(module)// 导出对象别名export// 当前文件的绝对路径import {fileURLToPath} from 'url';
const __filename = fileURLToPath(import.meta.url)// 当前文件所在目录import {dirname} from 'path';
const __dirname = dirname(__filename)

模块化加载_前端模块化概述相关推荐

  1. 模块化加载_前端模块化简单总结

    来源 | http://www.fly63.com/article/detial/9827 前言 JavaScript初期就是为了实现简单的页面交互逻辑,如今CPU.浏览器性能得到了极大的提升,很多页 ...

  2. 模块化加载_谈谈双亲委派模型的第四次破坏-模块化

    前言 JDK9引入了Java模块化系统(Java Platform Moudle System)来实现可配置的封装隔离机制,同时JVM对类加载的架构也做出了调整,也就是双亲委派模型的第四次破坏.前三次 ...

  3. iframe懒加载_前端常见问题

    原地址:https://blog.csdn.net/Mr_JavaScript/article/details/84311068 1. flex布局:又叫做弹性布局 任何一个容器都可以指定flex布局 ...

  4. dll文件懒加载_前端性能优化

    # 前端性能优化 写在最前面:下面都是我对webpack的一些性能优化,想系统的学习性能优化方面的知识 推荐大家看看这本书 很系统 感觉面试也能如鱼得水 ## 构建优化 ### webpack优化 ( ...

  5. ES6与CommonJS的模块化加载

    两个差异 CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用. 什么是值的拷贝,值的引用? 所谓值的拷贝,是在栈内存当中实现的,是一个复制的过程,复制之后两个值互不影响 值的引用 ...

  6. echarts与TmodJS的冲突 -- 模块化加载器之间的冲突

    前些日子写了一篇关于腾讯模板引擎TmodJS的文章<模板引擎artTemplate及模板预编译器TmodJS的使用入门>,算是对其原理与使用进行了初步的接触与研究.近期在一个项目中对Tmo ...

  7. 模块化加载_Java9模块化的类加载机制实现剖析

    前言 JDK9引入了Java模块化系统(Java Platform Moudle System)来实现可配置的封装隔离机制,同时JVM对类加载的架构也做出了调整,也就是双亲委派模型的第四次破坏.前三次 ...

  8. 中yeti不能加载_第二十章_类的加载过程详解

    类的加载过程详解 概述 在 Java 中数据类型分为基本数据类型和引用数据类型.基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载 按照 Java 虚拟机规范,从 Class 文件到加载到内 ...

  9. js让iframe延时加载_延迟加载IFRAME

    js让iframe延时加载 We've known for a decade that lazy loading resources like JavaScript, CSS, and especia ...

最新文章

  1. Python高级函数--map/reduce
  2. C#全局键盘监听(Hook)的使用(转载)
  3. java如何將數組反轉_Java基礎練習題 (4)數組操作
  4. zend guard6的使用
  5. Linux系统监控shell脚本
  6. linux 总数 进程_Linux运用一些常用命令,优秀的PHPer都需掌握
  7. 03 - 变量的数据类型
  8. HTML+CSS+JS实现 ❤️canvas 3D立体图片相册幻灯片❤️
  9. 因为难看的签名尴尬?Python爬虫制作艺术签名软件!
  10. error Link 2005
  11. 熊博士c语言,InstallShield2015制作安装包----------安装后实现电脑开机自启动
  12. 全国各省份结婚离婚面板数据(2000-2019年)
  13. HDFS RPC 调度策略 DecayRpcScheduler 与 BackOff
  14. cpp 读取txt文件
  15. html与css编程证书,利用CSS布局做一个简单的荣誉证书(代码示例)
  16. Edge 浏览器 URLSearchParams bug 修复
  17. 【文件格式_XML_HTML_】XML、HTML文件
  18. 我始终相信努力奋斗的意义
  19. (面经总结)一篇文章带你整理面试过程中关于OSI 七层模型的相关知识
  20. vue级联选择框(Cascader)动态渲染数据

热门文章

  1. 简单帅气的折纸机器人_新型电磁喷雾可将任何物体变成机器人,有望在生物学领域应用...
  2. 前端命名规范_值得收藏的前端命名规范
  3. 螺栓预紧力_斯姆勒知识讲解:螺栓预紧力的计算
  4. 结构体08:结构体案例2
  5. 天下谁人不识君:awt如何使用弹窗功能?
  6. 天梯—输出GPLT(C语言)
  7. Halcon 仿射变换
  8. Spring定时任务高级使用篇
  9. nginx的日志格式
  10. java解压缩和shell_shell 文件的归档和压缩