学习笔记(九)——模块化开发

模块化开发

模块化只是一种思想

模块化演变过程

  • Stage 1 - 文件划分方式
    • 将功能与数据放置到不同的文件当中
    • 约定每个文件都是一个独立的模块
    • 缺点:
      • 每个模块都在全局作用域下工作,污染全局作用域,容易出现命名冲突
      • 无法管理模块之间的依赖关系
      • 模块内的成员可以被其他模块随意修改
      • 完全依靠约定,当项目变得庞大以后,难以维护
  • Stage 2 - 命名空间方式
    • 每个模块只暴露一个全局对象
    • 所有成员与方法都挂载在这个全局对象下
    • 解决了全局作用域污染与命名冲突的问题
    • 缺点:
      • 依然无法管理模块之间的依赖关系
      • 模块的内的成员依然可以被修改
  • Stage 3 - IIFE(立即执行函数)方式
    • 使用立即执行函数,为模块创建私有空间
    • 对于需要对外暴露的内容,可以挂载到window对象上
    • 解决了模块内成员可以被随意修改的问题
  • Stage 4 - 模块化规范出现
    • CommonJS规范 - NodeJS模块化规范
      • 一个文件就是一个模块
      • 每个模块有单独的作用域
      • 通过module.exports导出成员
      • 通过require函数加载模块
      • 同步模式加载模块(在浏览器环境效率不高)
    • AMD(Asynchronous Module Definition)- 异步模块定义规范
      • require.js实现了AMD规范,同时是一个功能强大的模块加载器
      • 约定使用define函数定义一个模块,接收三个参数
        • 第一个参数:模块名称
        • 第二个参数:声明依赖数组
        • 第三个参数:提供私有空间的函数,通过return向外部导出成员
      • 使用require函数加载模块
      • 绝大多数第三方库都支持AMD规范
      • AMD模块使用起来相对复杂
      • 模块JS请求相对频繁
    • CMD(Common Module Definition)- 通用模块定义规范
      • 由淘宝前端团队推出的sea.js定义并实现了CMD规范
      • 类似CommonJS规范
      • 通过require加载依赖
      • 通过module.exports或exports对外暴露成员
      • 被require.js兼容

模块化标准规范

ES Module - ES2015中定义,并在语言层面实现的模块化规范

模块化的最佳实践,NodeJS环境下使用CommonJS规范,浏览器环境下使用ES Module

ES Module特性

  • 自动采用严格模式
  • 运行在独立私有作用域中
  • 通过CORS方式请求外部JS模块
    • 即script被标识为type=module方式引入外部资源时,会受到浏览器同源策略限制
  • script加载外部JS时,会延迟执行脚本,等同于使用defer属性,不影响页面渲染,执行顺序不按引用顺序

ES Module的导入导出

  • 通过export导出

    • 常见用法

      export const a = 1
      export const fn = () => {}
      export default 123
      export { a, fn as b }
      export t from './module.js'
      
    • 注意事项

      • export { obj }export default { obj }
        • export { obj } export后面跟的不是字面量对象,而是固定的语法
        • export default { obj } export default后面跟的是一个值,这里{ obj }表示字面量对象
      • export导出的是成员的引用,而不是成员值的拷贝,这与CommonJS不同
  • 通过import导入

    • 常见用法

      import { a, b, default as n } from './es-module.js'
      
    • 注意事项

      • import { obj } from xxx import后面的括号不是解构写法,而是固定的语法
      • import导入的对象是只读的,不允许修改
      • import导入文件路径不可省略(相对路径或者绝对路径)
      • 不支持表达式方式,如果需要动态加载模块,可以使用import()函数,该函数返回一个Promise对象

ES Module浏览器环境polyfill

browser-es-module-loader

  • 工作原理:
    • 读取ES Module脚本
    • 交给babel进行转换
    • 执行转换后的代码
  • 注意事项
    • 在支持ES Module的浏览器环境下,会导致重复执行
    • 可以使用script的nomodule属性,只会在不支持ES Module的浏览器环境下加载脚本

ES Module in Node.js

  • Node.js中目前可以使用ES Module语法加载或者导出模块,属于实验特性

  • 要在node环境下使用ES Module

    • JS文件需要使用.mjs结尾(新版本node在package.json中标识type: module时,可以直接使用.js文件后缀,此时想使用CommonJS模块,需使用.cjs结尾)

    • 执行时,需要添加--experimental-modules参数开启实验特性

      // 注意,必须先跟--experimental-modules参数,再接文件名
      node --experimental-modules import.mjs
      
  • 使用import加载其他模块

    • 第三方模块:无法使用提取成员的方式
    • 系统内置模块:官方做了兼容性处理,可以正常提取成员
    • CommonJS模块:导出一个对象,因此无法使用提取成员的方式加载模块,可以使用加载default默认对象的方式
  • CommonJS模块无法直接加载ES Module

  • ES Module与CommonJS模块的差异

    • ES Module下无法访问CommonJS内置成员及方法require、module、exports、__filename、__dirname
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容