在如今的前端工作中,模块化开发已经成为主流。无论是前端还是后端,开发者都在使用,因为模块化开发给我们带来了巨大的收益。前端实训模块化开发部分的面试题,主要考查考生对几种模块化开发规范的理解程度。考生应了解它们之间的异同,以及适用的场合。1、说说你对前端模块化开发的理解。相关知识如下。(1)AsynchronousModuleDefinition(AMD)规范是require.js推动的模块定义规范。(2)CommonModuleDefinition(CMD)规范是SeaJS推动的模块定义规范。(3)AMD先执行,CMD后执行(4)AMD推荐的风格是通过模块传输规范暴露接口,即通过返回一个对象来暴露模块接口;CommonJs的风格是通过给module.exports或exports的属性赋值来达到暴露一个模块接口的目的。2.谈谈你对CommonJS和AMD的理解。CommonJS是服务器端建模的规范,而Node.js采用了这个规范。CommonJS规范是同步加载模块的,即加载完成后才能进行后续操作。AMD规范异步加载模块,允许指定回调函数。AMD推荐的风格是通过模块传输规范来暴露接口,即通过返回一个对象来暴露模块接口。CommonJS风格是通过给module.exports或exports的属性赋值来暴露模块对象。3、模块化开发有什么好处?在web开发中,将一个项目的实现分成许多模块是很常见的。模块化开发其实就是把功能相关的代码封装在一起,方便维护和复用。另外模块之间通过API进行通信4.require.js解决了什么问题?解决了以下问题。(1)实现了JavaScript文件的异步加载。(2)帮助管理模块之间的依赖关系。(3)方便代码编写和维护。5、前端模块化解决了哪些问题?解决了以下问题。(1)每个模块的命名空间是独立的,模块A的变量x不会覆盖模块B的变量x。(2)通过模块管理工具(如webpack、require.js等)管理模块依赖。).6、如何实现前端模块化开发?require.js和SeaJS是适用于网络浏览器的模块加载器,使用它们可以更好地组织Javascript代码。7、模块化JavaScript开发有什么优势?优点如下。(1)功能分离(2)有更好的代码组织(3)可以按需加载。(4)避免命名冲突。(5)解决依赖管理问题8、你了解CommonJS规范吗?定义一个模块,即一个单独的文件是一个模块,文件中的作用域是独立的,文件中定义的变量不能被其他文件引用。如果需要使用这些变量,需要将它们定义为全局变量(不推荐)。输出模块是指该模块只有一个接口对象,即需要导出的内容可以通过module.exports对象放入这个对象中。加载模块是指通过require加载,比如varmodule=require('/moduleFile.js),模块的值对应文件里面的模块exports对象,然后可以引用接口变量或者接口函数通过模块名称暴露在模块中。9.谈谈你对CMD(CommonmoduleDefinition,公共模块定义)规范的理解。就近依赖,需要的时候加载,所以执行顺序和写的顺序一致;这点和AMD不同,AMD在使用模块之前加载了所有的依赖模块,但是由于网络等其他因素,可能会导致下载依赖模块的顺序不一致,这可能会导致执行顺序与书写顺序。10.你了解EMAScript6模块规范吗?相关理解如下。(1)类似Commonjs,语法更简洁(2)类似AMD,直接支持异步加载和配置模块加载(3)可以对结构进行静态分析和静态检测。(4)比CommonJS更好地支持循环依赖。11、为什么要模块化开发?理由如下。(1)高内聚低耦合有利于团队发展。当项目很复杂的时候,把项目分成子模块分给不同的人开发,最后再组合在一起。这样可以减少模块之间的依赖,实现低耦合。模块中有特定的功能,体现了高内聚的特性。(2)可重复使用,易于维护。模块的特点是具有特定的功能。当两个项目都需要某个功能时,定义一个具体的模块来实现该功能,这样在两个项目中都只需要引入这个模块就可以实现功能,而不用写重复的代码。另外,当需要更改功能时,可以直接修改模块,这样所有项目的功能都可以修改,维护起来非常方便。12、AMD和CMD有什么区别?区别如下(1)对于依赖模块,AMD先执行,CMD后执行,但是require.JS从2.0版本开始也可以改成延迟执行(看写法,处理方式是不同的)。(2)CMD推崇靠近,AMD推崇靠前。13、为什么需要前端模块化?JavaScript过去只是用来实现网页特效、表单验证等简单的功能,只需要少量的代码就可以完成这些功能。但是,随着技术的发展,需要用JavaScript来处理的事情越来越多。过去,很多原本在后台处理的内容,都转到了前端处理,导致代码量急剧膨胀。如果还是像以前那样写代码,后期维护起来会很困难。同时,在开发中,我们难免需要一些“轮子”。没有模块(Model)的概念,我们就很难轻易使用别人造的“轮子”。所以,我们需要前端模块化。14.前端模块化是否等同于JavaScript模块化?前端开发相对于其他语言来说比较特殊,因为我们总是需要JavaScript、CSS和HTML相互交织来实现一个页面功能。如果一个函数仅仅通过JavaScript进行了模块化,而CSS和Template还处于原来的状态,那么在调用这个函数的时候,是不能完全模块化的,这样的模块化方案是不完整的。所以我们真正需要的是一个能够同时兼顾JavaScript、CSS和HTML的模块化解决方案,而不是仅仅使用JavaScript模块化解决方案。综上所述,前端模块化并不等同于JavaScript模块化。15.JavaScript模块化等同于异步模块化吗?主流的JavaScript模块化方案都采用“异步模块定义”的方式,给开发带来极大的不便,需要将所有同步代码修改为异步方法。前端开发使用“CommonJs”模块化开发规范,开发者可以使用自然易懂的模块定义和调用方式,无需关注模块是否异步,无需改变开发者的开发思路行为。所以JavaScript模块化与异步模块化不同。16.require.JS和SeaJS有什么相同点和不同点?相似之处如下。require.JS和SeaiJS都是模块加载器,提倡模块化开发理念,其核心价值是让JavaScript模块化开发变得更简单、更自然。区别如下。(1)定位有差异。require.JS想做浏览器端的模块加载器,也想做rhino/node等环境的模块加载器。SeaJS侧重于web浏览器端,同时可以通过node扩展的方式方便的运行在Node服务器端(2)遵循的规范不同。require.JS遵循AMD规范,SeaJS遵循CMD规范。规范的不同导致了两者API的不同。SeaJS更简洁优雅,更接近CommonJSModules/1.1和NodeModules规范。(3)require.JS试图让第三方库修改自己来支持require.JS。SeaJS不强求,用独立包装“海纳百川”。17、系统在设计上遵循了多少原则?遵循以下原则(1)在编译时包含所有依赖项。(2)去中心化实现分发(3)内置命名和包装。18.什么是模块化规范?服务器端规范主要是CommonJS,Node.js使用的是CommonJS规范。客户端规范主要包括pre-reliableAMD和附近的CMD。AMD规范的实现主要包括require.js。CMD规范的主要实现是SeaJS。不过SeaJS已经停止维护了,因为EMAScript6中提供了EMAScriptModule模块化规范,随着EMAScript6的普及,第三方模块化规范的实现会逐渐被淘汰。原作者:web前端开发
