js模块化概述:从CommonJS到ES6

发布于:2024-10-24 编辑:匿名 来源:网络

模块化是指将一个复杂的系统一一分解为模块。模块化开发的优点:(1)代码复用让我们更容易管理代码,也方便后续代码的修改和维护。

(2) 单独的文件是一个模块,一个单独的作用域,它只暴露特定的变量和函数。这样可以避免污染全局变量,减少变量命名冲突。

Node.js 模块化规范包括:CommonJS、AMD、CMD 和 ES6 模块系统。本文将依次介绍各个规格。

0.早期:使用script引入js模块代码语言:javascript copy 缺点 (1)加载时会停止渲染网页。引入的js文件越多,网页失去响应的时间就越长; (2)会污染全局变量; (3) js文件之间存在依赖关系,加载是有顺序的,最依赖的应该最后加载;当项目规模较大时,依赖关系变得复杂。

(4)引入的js文件太多,不美观,代码难以管理。 1. CommonJS规范是服务器端模块的规范,由nodejs推广和使用。

这个规范的核心思想是让模块通过require方法同步加载自己依赖的其他模块,然后通过exports或者module.exports导出需要暴露的接口。 CommonJS还可以细分为CommonJS1和CommonJS2。

不同的是CommonJS1只能通过exports.xx = xx导出。 CommonJS2在CommonJS1的基础上增加了 module.exports = xx 导出方法。

CommonJS通常指CommonJS2。使用 CommonJS 规范导入导出: 代码语言:javascript copy // Export module.exports = moduleA.someFunc; // 导入 const moduleA = require('./moduleA');示例:代码语言:javascript copy //math.jsvar num = 0;function add(a, b) { return a + b;}module.exports = { //需要对外暴露的变量和函数 num: num, add: add} 可以这样加载: 代码语言: javascript copy //引入自定义模块时,参数包含路径,可以省略.js //引入核心模块时,不需要包含路径,如 var http = require("http");var math = require('./math') ;math.add(1, 2)//3 其实从上面的例子可以看出,math. add(1,2)必须等待math.js加载完毕,即require是同步的。

在服务器端,模块文件保存在本地磁盘上,等待时间就是磁盘读取时间。但对于浏览器来说,由于模块放置在服务器端,因此等待时间取决于互联网的速度。

因此,更合理的解决方案是异步加载模块。缺点:(1)模块无法并行加载,会阻塞浏览器加载; (2)代码不能直接在浏览器环境运行,必须通过工具转换为标准ES5; 2.AMD和require.jsAMD:异步模块定义。

如上所述,CommonJS 是服务器端模块的规范。主要是为了后端JS的性能而制定的,不太适合前端。

AMD希望为前端JS的性能制定标准。由于原生不支持JavaScript,使用AMD规范的页面开发需要使用相应的库函数,即require.js(还有一个js库:curl.js)。

其实AMD就是require.js推广过程中模块定义的标准化输出。 AMD采用异步方式加载模块,模块的加载不影响后续语句的执行。

所有依赖于该模块的语句都在回调函数中定义。直到加载完成后,该回调函数才会运行。

require.js 也使用 require() 语句来加载模块,但与 CommonJS 不同: 代码语言: javascript copy // 定义一个模块 define('module', ['dep'], function (dep) { returnexports ;}); //导入并使用 require(['module'], function (module) {});将上面例子中的代码重写为AMD形式: math.js 定义了一个模块: 代码语言: javascript copy Define('math', [ 'jquery'], function (jquery) {//引入 jQuery 模块 return { add:函数 (x, y) { 返回 x + y; } };});导入和使用:代码语言:javascript copy require(['math'], function (math) { math.add(1, 2)})math.add() 与加载 math 模块不同步,不会阻塞浏览器的加载。 3.CMD和sea.jsCMD:公共模块定义。

国内老大宇博写的是sea.js。其实CMD就是sea.js推广过程中模块定义的标准化输出。

代码语言:javascriptcopydefine(function(require,exports,module){ //模块代码});描述:require:可以从其他模块导入的参数; Exports:可以导出模块中的一些属性和方法;module:是一个对象,存储了与当前模块相关的一些属性和方法。将上面示例中的代码重写为 AMD 形式: 代码语言:javascript copy Define(function (require,exports, module) { var add = function (a, b) { return a + b; }exports.add = add; }) //导入并使用seajs.use(['math.js'], function (math) { var sum = math.add(1, 2);}); CMD和AMD的区别在于:(1)AMD建议Dependency预定位; CMD 建议就近使用依赖,仅在使用某个模块时需要: 代码语言:javascript copy //AMD 建议依赖前置:定义模块时,必须声明要依赖的模块 Define( [' a', 'b', 'c', 'd'], function (a, b, c, d) { // 依赖项必须写在开头 a.doSomething() // 此处省略该行。

. b.doSomething() ...})//CMD 建议将依赖项保留在附近并按需加载。仅当使用某个模块时,requiredefine(function (require,exports,modules) { var a = require('a'); a.doSomething(); // 省略这里的行... var b = require(" b");//加载 b.doSomething(); ...})(2)AMD 的 默认情况下,一个 API 可以被多个用户使用。

CMD的API严格区分,建议单一职责。对于依赖模块,AMD提前执行,CMD延迟执行。

具体详情请点击参考 4.ES6模块化 ES6在语言层面实现了模块化。浏览器供应商和 Node.js 都宣布了对该规范的原生支持。

它将逐步取代CommonJS和AMD规范,成为浏览器和服务器的通用模块解决方案。在ES6中,使用export关键字导出模块,使用import关键字引用模块。

不过浏览器还没有完全兼容,需要使用babel转换为ES5。代码语言:javascript copy //导出导出函数hello(){};导出默认值 { // ...}; // 导入 import { readFile } from 'fs';从“反应”导入反应;使用import导入模块时,需要知道要加载的变量名或函数名。

ES6还提供了export default,它指定模块的默认输出。导入相应模块时,不需要使用大括号。

将上面例子中的代码重写为ES6形式: 代码语言:javascript copy //math.jsvar num = 0;var add = function (a, b) { return a + b;};export { num, add }; // 导入 import { num, add } from './math'; function test(ele) { ele.textContent = add(1 + num);} 缺点:浏览器尚未完全兼容,必须通过工具转换为标准 ES5。正常运行。

5.总结本文从通过脚本引入js文件开始,到服务器端模块规范CommonJS,再到倡导依赖前端的浏览器端模块的规范AMD,以及倡导依赖前端的CMD规范在附近的浏览器端模块上。最后介绍了ES6的模块化。

每个介绍都包括每个规范的基本用法和示例。如有疑问,请指正。

js模块化概述:从CommonJS到ES6

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 最受关注的大型样板项目路演现场,百度智能云千帆AI加速器首个Demo Day已拉开帷幕!

    最受关注的大型样板项目路演现场,百度智能云千帆AI加速器首个Demo Day已拉开帷幕!

    自动化智能企业AI智能法务、私密专属的健康双胞胎、打破求职信息鸿沟的AI职业规划助理、精准高效可靠的AI行业顾问……近期,百度智能云AI加速器*演示日活动在北京成功举办。 从AI加速器一期、二期运营企业+项目中脱颖而出的10个AI原生应用项目登台展示了他们在法律、医疗、招

    06-18

  • PPLive CEO陶闯:我们资金充足,不急于上市

    PPLive CEO陶闯:我们资金充足,不急于上市

    据7月21日消息,当不少中国视频网站已经实现或即将赴美上市时,PPLive CEO(CEO) )陶闯近日表示,PPLive已经拥有足够的资金,不急于上市。 PPLive也会做好准备,希望能找到上市的好时机。   据了解,PPLive此前已获得软银、德丰杰龙脉中国基金等多家风投公司的投资。 今年

    06-18

  • 致力于人工智能烹饪机器人研发,御膳坊获数千万元天使轮融资

    致力于人工智能烹饪机器人研发,御膳坊获数千万元天使轮融资

    御膳房近日完成数千万元天使轮融资,由国宏嘉信、索道资本投资。 本轮资金将用于产品研发、团队拓展及推广营销。

    06-17

  • 阿里云创新峰会聊城站暨2022山东(聊城)跨境电商峰会明天开幕

    阿里云创新峰会聊城站暨2022山东(聊城)跨境电商峰会明天开幕

    在聊城市商务和投资促进局、聊城高新技术产业开发区指导下,聊城跨境电商阿里云联合主办的阿里云创新峰会聊城站暨山东(聊城)跨境电商峰会将于8月13日(明天)上午9:00举行。 商务部专家等多位大咖解读行业趋势、发布平台政策,分享实际案例,帮助鲁商抓住跨境红利和商机。

    06-17

  • 首次发布 -银山与钟鼎联合领投,苏映视完成近亿元A+轮融资

    首次发布 -银山与钟鼎联合领投,苏映视完成近亿元A+轮融资

    近日,3D视觉+AI检测系统提供商——苏映视获得近亿元A+轮融资。 本轮融资由银山资本、钟鼎资本联合领投,老股东元和金谷资本跟投。 本轮资金将继续用于研发和产能建设。

    06-17

  • 华强北依靠Vision Pro再战“翻身”

    华强北依靠Vision Pro再战“翻身”

    地铁站里的乘客比划着,健身房里的老人在虚空中施展咒语,甚至有人戴着头盔遛着机器狗…… Apple Vision Pro第一波线下销售已正式启动,首批试用者通过一系列的评测和花哨的玩法,成功带动了Vision Pro的热度,激起了全球消费者的好奇心这个“新物种”。 七年来,苹果通过 Vi

    06-18

  • 家庭IT服务平台三味家获阿里巴巴数亿元战略投资

    家庭IT服务平台三味家获阿里巴巴数亿元战略投资

    据投资界10月1日消息,据亿欧报道,家庭IT服务平台三味家获数亿元战略投资来自阿里巴巴的投资。 本轮投资具体金额约为5亿元,投后估值约为25亿元。 天眼查信息显示,阿里巴巴已成为三味家第一大股东,持股20%。 三味家的创始人蔡志森和红星美凯龙分别为第二大股东和第三大股

    06-18

  • 启明与甘剑平的点石成金:如何解开“独角兽”背后的遗传密码

    启明与甘剑平的点石成金:如何解开“独角兽”背后的遗传密码

    相传古希腊国王迈达斯(点石成金),又名“黄金国王”,救出酒神导师迪奥索斯(狄俄尼索斯)后),他获得了点石成金的感觉。 之后,他所触碰的一切都变成了金子。   以这位传奇人物命名的福布斯迈达斯排行榜,又被称为“金手指”排行榜,堪称“风险投资界的奥斯卡”。 在今

    06-18

  • 从地图到无人驾驶汽车,网约车新政已经无法束缚滴滴这匹“野马”

    从地图到无人驾驶汽车,网约车新政已经无法束缚滴滴这匹“野马”

    你不了解滴滴,但滴滴有远大的梦想。 在网约车新政策的重压下,滴滴打车难的问题终于在1月份爆发。 在乘客对滴滴未来的抱怨和担忧中,程维在1月14日给大家定了一颗定心丸,他表示滴滴并不满足于做一个旅游平台。 滴滴的使命是成为新能源汽车的领导者。 操作员。 1月17日,柳青

    06-17

  • 微软262亿美元收购Linkedin,欧盟终于点头

    微软262亿美元收购Linkedin,欧盟终于点头

    今年6月,微软宣布将以每股1美元的价格收购专业社交网络Linkedin,交易总价值1亿美元。 然而,11月,欧盟反垄断机构仍对该交易存有疑虑,并向微软提出保护措施,以减轻其反垄断担忧,微软必须就此做出让步。 据《华尔街日报》报道,欧盟今日正式宣布批准微软以 1 亿美元收购

    06-18

  • 阿里云【AI24小时】2024年3月8日

    阿里云【AI24小时】2024年3月8日

    1.王兴,再次以“有限”押注无限>>点击查看原文 今年2月初,王兴在公司发出内部信:“美团平台,王莆负责配送到店、到家、基础研究和发展等” “张川负责大众点评、SaaS、骑行、充电宝等。 ” “向我报告无人机和海外业务。 ”消息一出,美团股价小幅回升。 王兴知道,继续玩

    06-17

  • 360集团与大唐高宏达成战略合作,加速车联网安全防护网建设

    360集团与大唐高宏达成战略合作,加速车联网安全防护网建设

    据2月4日消息,昨日,科技集团有限公司与大唐高宏数据网络科技有限公司达成战略合作。 基于新四家的背景和各自车联网业务的发展,双方将充分发挥各自的平台优势,共同瞄准车联网、智慧交通、智慧城市等领域的出口解决方案推动车联网安全生态体系建设。

    06-17