前端面试之模块化-1、模块的写法

web前端面试-- 模块化的几种规范CMD、COMMONJS、AMD、ESM以及UMD模块化解决方案,export *的写法 JavaScript 目前有四种模块规范:CMD、COMMONJS、AMD 和 ESM。CMD 是 JavaScript 最早的模块规范,它使用 require 函数来导入模块。CMD 模块是 JavaScript 最早的模块规范,但它存在一些缺陷,比如模块的导入顺序不受控制,模块的依赖关系无法被管理,等等。COMMONJS 是 JavaScript 模块的另一种,它使用 require 函数来导入模块。COMMONJS 模块在解决CMD。 阅读详情

原文链接:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html

随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂。

网页越来越像桌面程序,需要一个团队分工协作、进度管理、单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑。
Javascript模块化编程,已经成为一个迫切的需求。理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块。
但是,Javascript不是一种模块化编程语言,它不支持"类"(class),更遑论"模块"(module)了。(正在制定中的ECMAScript标准第六版,将正式支持"类"和"模块",但还需要很长时间才能投入实用。)
Javascript社区做了很多努力,在现有的运行环境中,实现"模块"的效果。本文总结了当前"Javascript模块化编程"的最佳实践,说明如何投入实用。虽然这不是初级教程,但是只要稍稍了解Javascript的基本语法,就能看懂。

一、原始写法

模块就是实现特定功能的一组方法。
只要把不同的函数(以及记录状态的变量)简单地放在一起,就算是一个模块。

  function m1(){
    //...
  }
  function m2(){
    //...
  }

上面的函数m1()和m2(),组成一个模块。使用的时候,直接调用就行了。
这种做法的缺点很明显:"污染"了全局变量,无法保证不与其他模块发生变量名冲突,而且模块成员之间看不出直接关系。

二、对象写法

为了解决上面的缺点,可以把模块写成一个对象,所有的模块成员都放到这个对象里面。

  var module1 = new Object({
    _count : 0,
    m1 : function (){
      //...
    },
    m2 : function (){
      //...
    }
  });

上面的函数m1()和m2(),都封装在module1对象里。使用的时候,就是调用这个对象的属性。

module1.m1();

但是,这样的写法会暴露所有模块成员,内部状态可以被外部改写。比如,外部代码可以直接改变内部计数器的值。

module1._count = 5;


三、立即执行函数写法

使用"立即执行函数"(Immediately-Invoked Function Expression,IIFE),可以达到不暴露私有成员的目的。

  var module1 = (function(){
    var _count = 0;
    var m1 = function(){
      //...
    };
    var m2 = function(){
      //...
    };
    return {
      m1 : m1,
      m2 : m2
    };
  })();
使用上面的写法,外部代码无法读取内部的_count变量。

console.info(module1._count); //undefined

module1就是Javascript模块的基本写法。下面,再对这种写法进行加工。

四、放大模式

如果一个模块很大,必须分成几个部分,或者一个模块需要继承另一个模块,这时就有必要采用"放大模式"(augmentation)。
  var module1 = (function (mod){
    mod.m3 = function () {
      //...
    };
    return mod;
  })(module1);

上面的代码为module1模块添加了一个新方法m3(),然后返回新的module1模块。

五、宽放大模式(Loose augmentation)

在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载。如果采用上一节的写法,第一个执行的部分有可能加载一个不存在空对象,这时就要采用"宽放大模式"。

  var module1 = ( function (mod){
    //...
    return mod;
  })(window.module1 || {});

与"放大模式"相比,"宽放大模式"就是"立即执行函数"的参数可以是空对象。

六、输入全局变量

独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。
为了在模块内部调用全局变量,必须显式地将其他变量输入模块。

  var module1 = (function ($, YAHOO) {
    //...
  })(jQuery, YAHOO);
上面的module1模块需要使用jQuery库和YUI库,就把这两个库(其实是两个模块)当作参数输入module1。这样做除了保证模块的独立性,还使得模块之间的依赖关系变得明显。这方面更多的讨论,参见Ben Cherry的著名文章《JavaScript Module Pattern: In-Depth》。
这个系列的第二部分,将讨论如何在浏览器环境组织不同的模块、管理模块之间的依赖性。

【高频考点精讲】前端模块化演进史:从IIFE到ES Module的完整历程 🧑‍🏫:全栈老李📅:2025 年 7 月🧑‍💻:前端初学者、进阶开发者🚀:本文由全栈老李原创,转载请注明出处。大家好,我是全栈老李。今天咱们聊聊前端模块化这个老生常谈但又极其重要的话题。记得我刚入行那会儿,还在用jQuery一把梭,代码写得跟意大利面条似的,一个JS文件动辄几千行,找bug就像在垃圾堆里翻硬币...直到后来接触了模块化,才明白什么叫"代码的优雅"。 阅读详情

相关推荐

前端最新面试题(ES6模块篇)

前端最新面试题 ES6模块

前端的路上 1677

Javascript模块化编程(一):模块的写法

随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂。 网页越来越像桌面程序,需要一个团队分工协作、进度管理、单元测试等等......开发者不得不使用软件工程的方法,管理网页的业务逻辑。 Javascript模块化编程,已经成为一个迫切的需求。理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块。 但是,Javascript...

weixin_30851867的博客 509

当你被问到前端模块化?(2026)

1. 模块化简述 把复杂代码按功能的不同划分成不同的模块单独维护,提高开发效率,降低维护成本 模块化只是思想、理论,不包含具体实现 2. 模块化的诞生 简单来说,就是一个人做不完的事,分成了多个人做,每人负责一个块内容(模块),最后把每个人做的东西组装一起成为整体

前端必备小窝 507

JavaScript模块化开发

1 认识模块化开发 2 CommonJS和Node 3 require函数解析 4 AMD和CMD(了解) 5 ESModule用法详解 6 ESModule运行原理

weixin_56663198的博客 2042

【前端面试知识题】- 模块化开发

就近依赖,需要时再进行加载,所以执行顺序和书写顺序一致;这一点与AMD不同,AMD是在使用模块之前将依赖模块全部加载完成,但由于网络等其他因素可能导致依赖模块下载的先后顺序不一致,这就造成执行顺序可能与书写顺序不一致。服务器端规范主要是 CommonJS, Node.js用的就是 CommonJS规范客户端规范主要有推崇依赖前置的AMD和推崇依赖就近的CMD。AMD规范的实现主要有 require.js。CMD规范的主要实现有 SeaJS。

拉格朗日的学习笔记 1191

window_module:弹窗组件 模块化代码

window_module 弹窗组件 模块化代码 #使用方法 //在主模块文件js/main.js中可以这样调用 require.config({ paths: { 'jquery': 'jquery-2.1.1.min', 'jqueryUI': 'http://code.jquery.com/ui/1.10.4/jquery-ui' } }); require(['jquery', 'window'], function($, w) { $('#a').click(function(event) { var win = new w.window({ width: 300, height: 150, content: 'welcome',

Javascript模块化编程(二):AMD规范

这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块。 (接上文) 七、模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块。 但是,这样做有一个前提,那就是大家必须以同样的方式编写模块,否则你有你的写法,我有我的写法,岂不是乱了套!考虑到Javascript模块现在还没有官方规范,这...

weixin_30372371的博客 316

C#实现的MES车间信息控制系统

C#实现的MES车间信息控制系统

Idea导入GitHub项目Module文件变成普通文件的解决办法

如下图,做项目时,导入了小组的项目时,我自己写的项目是Module文件,但从网上导入其他人的项目时,其他人的项目变成了普通文件夹,下面说下解决方法。 1、使用快捷键ctrl+alt+shift+s或点击File,选中Project Structure,然后弹出如图界面,按照图中步骤点击。 2、接下来选中图中箭头所指Import Module,然后选择想要修改的文件夹。 ...

YCarlos的博客 2716

js-dxf:JavaScript DXF编写器

JavaScript DXF编写器 简单的编写器。 正在安装 npm install dxf-writer Node.js示例 const Drawing = require ( 'dxf-writer' ) ; const fs = require ( 'fs' ) ; let d = new Drawing ( ) ; d . setUnits ( 'Decimeters' ) ; d . drawText ( 10 , 0 , 10 , 0 , 'Hello World' ) ; // draw text in the default layer named "0" d . addLayer ( 'l_green' , Drawing . ACI . GREEN , 'CONTINUOUS' ) ; d . setActiveLayer ( 'l_green' ) ; d . dra

Type-C快充移动电源芯片避坑指南:IP5356配置全流程(支持PD3.0)

本文详细解析了英集芯IP5356芯片在Type-C快充移动电源中的应用,提供了从芯片选型、原理图设计、PCB布局到PD协议调试的全流程实战指南。文章重点剖析了如何避免散热、EMI及协议握手等常见设计陷阱,并分享了量产前的关键测试验证方法,旨在帮助硬件开发者高效打造稳定可靠的快充产品。

weixin_29235525的博客 856

当你被问到前端模块化

最近一个前同事和我聊天,聊到他去面试的时候,被面试官问到前端模块化的问题,他的回答换来的是面试官的一句“你说了,但是好像又没说”,他备受打击,怀疑人生的问我前端模块化到底是啥?说他好像知道,又好像说不出所以然来,所以就有了这一份关于模块化的内容,来一起捋一捋问问题一般是从总体追问到细节如果面试问到关于模块化的问题,要有清晰的条理去回答,先回答总体的概念,如果有追问,再根据细节回答即可提示:面试你的人其实不一定需要你一口气说完多深的理解,你可以用简单易懂的大白话,条理清晰即可,先抛一下。

Web面试那些事儿的博客 930

别再死记硬背公式了!用Unity ShaderGraph从零实现一个皮肤SSS效果(附完整节点图)

本文详细介绍了如何利用Unity ShaderGraph零代码实现皮肤次表面散射(SSS)效果,包括背光透射(BTDF)和表面散射(BSSRDF)的核心原理与节点构建方法。通过可视化工具,技术美术师和Shader初学者可以直观理解光线在皮肤组织中的散射行为,快速创建真实的皮肤材质效果,适用于游戏角色渲染等场景。

weixin_30838873的博客 595

前端面试题之模块化开发

如今的前端工作中,模块化开发成为主流,无论是前端还是后端,由于模块化开发为我们带来巨大的收益,因此开发者都在使用它。前端培训模块化开发部分的面试题主要考察应试者对几种模块化开发规范的了解,应试者要明白它们之间的异同点,以及所适用的场合。 1、说说你对前端模块化开发的认识。 相关认识如下。 (1)异步模块定义(AMD)规范是 require. js推广的、对模块定义的规范。 (2)通用模块定义(CMD)规范是 SeaJS推广的、对模块定义的规范。 (3)AMD提前执行,CMD延迟执行 (4)AMD

m0_58371965的博客 287

【项目实战-MATLAB】:基于机器学习的虹膜识别系统设计

虹膜识别主要包括虹膜定位、虹膜裁剪、极坐标变换、归一化、HOG特征提取、虹膜识别六个主要步骤。本系统采用MATLAB作为开发工具实现 主要算法:霍夫变换预处理 HOG特征提取 SVM进行识别

qq_45047246的博客 6538

SAP ERP 物料主数据同步外围系统

w_input-beskz = i_marc_new-beskz."采购类型 " BESKZ--- ADD BY HX_FHJ 20210106。w_input-beskz = lw_marc-beskz."采购类型 " BESKZ--- ADD BY HX_FHJ 20210106。w_input-sobsl = i_marc_new-sobsl."特殊采购类型-虚拟物料标识。

ChampaignWolf的专栏 1747

弄懂前端模块化,CommonJS,AMD,CMD及ES6模块化

前言 之前一直对于前端的模块化理解的不太透彻,平常一直用的也只有ES6模块化,对于其他几种模块化规范用的也少,理解不够深,但是经常会见到一些面试题是问这几种模块化规范的区别,所以这次做一个整理总结 一、对于模块化的理解 什么是模块化? 模块化开发是一种管理方式,是一种生产方式,一种解决问题的方案,一个模块就是实现特定功能的文件,有了模块,我们就可以更方便地使用别人的代码,想要什么功能,就加载什么模块,但是模块开发需要遵循一定的规范,否则就都乱套了,因此,才有了后来大家熟悉的AMD规范,CMD规范,以及ES

index_zhao的博客 787

USRP X410 MPM版本与主机UHD版本不匹配问题记录与解决

至此大功告成!之前安装软件的坑算是填起来了,再次记录一下,希望能帮到有同样问题的小伙伴~

yanzuwu233的博客 1437

【前端面试题】11—18道有关模块化开发的面试题(附答案)

如今的前端工作中,模块化开发成为主流,无论是前端还是后端,由于模块化开发为我们带来巨大的收益,因此开发者都在使用它。模块化开发部分的面试题主要考察应试者对几种模块化开发规范的了解,应试者要...

web前端开发 1569

开源大模型推理GPU资源评估以及优化

随着大模型的火热很多项目中都使用到了开源大模型,这时候准确评估大模型的GPU资源非常重要,主要有下面几个方面:GPU是昂贵的资源。高估内存需求可能导致在硬件上的不必要支出,而低估则可能导致系统故障或性能下降。:适当的内存管理确保模型高效运行,能够更快地响应用户并处理更多并发请求。:随着需求的增长,理解内存需求对于在不牺牲性能或产生高昂成本的情况下扩展服务至关重要。尽管其重要性显而易见,但计算用于服务大型语言模型(LLM)的GPU内存并不简单。

优快云DN的博客 3118

【存储原理】IO超时处理 块层block-scsi层之间

【存储原理】IO超时处理 块层block-scsi层之间

sinat_37817094的博客 1025

【前端面试题】10—18道有关模块化开发的面试题(附答案)

如今的前端工作中,模块化开发成为主流,无论是前端还是后端,由于模块化开发为我们带来巨大的收益,因此开发者都在使用它。模块化开发部分的面试题主要考察应试者对几种模块化开发规范的了解,应试者要...

前端达人 1008

【Flink】FlinkSQL如何触发执行计算

Table (通过 StatementSet.addInsert() 输出给某个 Sink)和 INSERT 语句 (通过调用 StatementSet.addInsertSql())会先被缓存到 StatementSet 中,StatementSet.execute() 方法被调用时,所有的 sink 会被优化成一张有向无环图。该方法是用来将一个表的内容插入到目标表中,一旦该方法被调用, TABLE API 程序立即被翻译。该方法是用来执行一个 SQL 语句,一旦该方法被调用, SQL 语句立即被翻译。

一杯咖啡半杯糖的博客 1007

(新手总结)前端模块化,AMD,CMD 面试总结

最近在群里看到一些小伙伴讨论到面试题,楼主在面试时遇到的面试问题,恶补一下。 commonJS,CMD/AMD对应类似的实现是 noedJs(webpack)/RequireJs/SeaJs  AMD/CMD主要针对浏览器端。 模块化 一个模块化实现特定功能,组织JS中的业务逻辑,都可以称为模块化。这种模块化类似于 java中的包 直接引入,即插即用,不会产生变量冲突,就是如此便捷。 c...

Miss_GL的博客 7233

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

2024年前端最新前端模块化详解(完整版),web前端面试基础题

Node 应用由模块组成,采用 CommonJS 模块规范。每个文件就是一个模块,有自己的作用域。在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见。在服务器端,模块的加载是运行时同步加载的;在浏览器端,模块需要提前编译打包处理。foo() {// app.js文件// 引入第三方库,应该放置在最前面index.html文件要运行在浏览器上,需要借助browserify将app.js文件打包编译,如果直接在index.html引入app.js就会报错!

2401_84616585的博客 847

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 前端面试之模块化-3、require.js的用法
下一篇: JavaScript事件代理和委托
hellochenlu
博客等级 码龄14年 97粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值