-
模块化开发
2017-09-19 11:25:19* 自用笔记:模块化开发学习 *模块化开发1. 概述1.1 当你的网站开发越来越大复杂的时候,会经常遇到什么问题? 命名冲突 文件依赖 。。。。。。 各种问题。。。 1.2 程序模块化开发优点 开发效率高 代码方便重用,...* 自用笔记:模块化开发学习 *
模块化开发
1. 概述
1.1 当你的网站开发越来越大复杂的时候,会经常遇到什么问题?
- 命名冲突
- 文件依赖
- 。。。。。。
- 各种问题。。。
1.2 程序模块化开发优点
- 开发效率高
- 代码方便重用,别人开发的模块直接拿过来就可以使用,
- 不需要重复开发类似的功能
- 方便后期维护
- 软件的声明周期中最长的阶段其实并不是开发阶段,
而是维护阶段,需求变更比较频繁,使用模块化的开发
- 软件的声明周期中最长的阶段其实并不是开发阶段,
1.3 总结
- 生产角度
一种生产方式,生产效率高,维护成本低 - 软件开发角度
就是一种开发模式,写代码的一种方式,开发效率高,
方便后期维护
1.4. 非模块化开发的问题
- 命名冲突
团队协作开发,不同开发人员的变量和函数命名可能
相同 - 文件依赖
代码重用时,引入js文件的数目可能少了或者引入的
顺序不对
1.5 模块的维护扩展(计算器实例)
1.5.1 非模块化下的弊端
- 计算器模块:在全局定义四个分别用来计算加减乘除的四个函数
- 全局函数形成的模块只能人为的认为它们属于一个模块
- 但是程序并不能区分哪些函数是同一个模块
问题 - “污染”了全局变量,无法保证不与其它模块发生变量名冲突
- 模块成员之间看不出直接关系
1.5.2 对象封装 – 命名空间
- 将原来的计算器的四个函数封装到一个对象命名空间下
- 通过添加命名空间的形式从某种程度上解决了变量命名冲突的问题,但是并不能从根本上解决命名冲突
- 从代码级别可以明显的区分出哪些函数属于同一个模块
- 问题
- 暴露了所有的模块成员,内部状态可以被外部改写,不安全
- 命名空间越来越长
<body> 第一个数:<input id='x' type="text" name='name'> <select name="" id="opt"> <option value="+">+</option> <option value="-">-</option> <option value="*">*</option> <option value="/">/</option> </select> 第二个数: <input id='y' type="text" name='name'> <button type='button' name='button' id='btn'>=</button> 结果:<input type="text" name='name' id='result'> <script src='./calculator.js'></script> <script> var cal = (function(c){ c.divide = function(x,y){ return x / y; }; c.multiply = function(x,y){ return x * y; } return c; })(window.cal||{}); var btn = document.getElementById('btn'); btn.onclick = function(){ // 1. 获取文本框的值 var x = parseInt(document.getElementById('x').value); var y = parseInt(document.getElementById('y').value); // 2. 获取运算符 var opt = document.getElementById('opt'); var sum = 0; // 3. 运算 switch(opt.value){ case '+':sum = cal.add(x,y);break; case '-':sum = cal.sub(x,y);break; case '*':sum = cal.multiply(x,y);break; case '/':sum = cal.divide(x,y);break; default: } var result = document.getElementById('result'); result.value = sum; } </script> </body>
- 私有共有成员分离
- 将命名空间形式的计算器模块封装为立即执行函数形式,通过在函数内部返回值得形式向外暴露
- 私有空间的变量和函数不会影响全局作用域
- 公开公有方法,隐藏私有空间内部的属性、元素
var cal= (function(){ return { add:function(x,y){ return x + y; }, sub:function(x,y){ return x - y; } } })();
总结
- 通过向对象的属性挂载功能实现扩展
- 开闭原则
- 代码健壮性判断
1.6 模块的第三方依赖
- 模块最好要保证模块的职责单一性,最好不要与程序的其它部分直接交互
- 通过向匿名函数注入依赖项的形式,除了保证模块的独立性,还使模块之间的依赖关系变得明显
<body> <script src='./jquery-1.11.1.min.js'></script> <script src='./third.js'></script> </body>
third.js:
//匿名自执行函数 (function($,q,t){//可以通过控制台报错来纠正 console.log($); $('body').css({'backgroundColor':'green'}); }(window.$||{},window.q||{},window.t||{}));//对外显示出这段代码所依赖的第三方
2. SeaJS的使用
一个基于CMD规范实现的模块化开发解决方案
作者:Alibaba 玉伯
官网:http://seajs.org/
github:https://github.com/seajs/seajs
特性:
简单友好的模块定义规范
自然直观的代码组织方式2.1 全局函数
// js加载机制中,由上到下加载 // 如果遇上变量的声明 是全局作用域 // 当全局中出现两个同名变量时? 会被覆盖, 而不是先声明后不允许重复声明
- 文件引入顺序的依赖
- 全局变量的污染,无法使用多个同名变量
- 变量之间的关系不明显
2.2 命名空间
- 解决了同名函数命名冲突问题
- 对象将所有数据都向外暴露了,可以供外部修改,不安全
- 私有属性,一般不向外暴露,而是提供公共的访问方式
2.3 划分私有命名空间
- 1: 为了保证属性私有化,使用自执行函数,让变量是函数的作用域
- 2: 不再将变量直接暴露,而是提供对应的访问方式
- 3: 基于命名空间的保护,可以允许同名属性名称
function getMoney(){ return money; }
2.4 扩展与维护
- 坚持开闭原则(对于添加开发,对于修改是封闭)
- 使用自执行函数,将对象传递进来,进行属性的添加(挂载新属性)
- window.cal||{} 是为了保证程序的健壮性
var cal = (function(c){ //添加乘法和除法功能 c.divide = function(x,y){//查找机制是当前没有,就向上级查找 return x/y; } c.multiply = function(x,y){ return x * y; } return c;//将对象返回回去 })(window.cal||{}); //从当前window对象取cal对象,如果没有,就给空对象,
2.5 第三方依赖
- 依赖没有文档说明: 根据报错一个个的来整
- 依赖注入: 将自己逐级向上查找,转换为,通知外部传入
- (window.$||{},wndow.q||{},wndow.t||{}); 将需要的对象在参数列表声明
2.6 模块化的好处
- 模块化的好处: 生产效率高/便于维护/便于扩展/复用性高
2.7 模块化分类 CMD&AMD
- CMD 推崇同步加载 加载机制: 延迟加载(滞后/懒加载)
- 开发代码的规范(严格来讲就是模块化) —制约 文本要求
- seajs 按照CMD实现(先有规范 后有实现)
- seajs 模块化加载框架 代码就是CMD代码 seajs作者 玉伯
- AMD 推崇异步加载 加载机制: 前置加载(优先加载)
- 开发代码的规范(严格来讲就是模块化) —制约 文本要求
- require.js (老外开发)
- 先要根据规范才有实现 –> seajs 或者 requireJS
2.8 使用步骤
- 引入 sea.js 库
<script src='../code/seajs-3.0.0/dist/sea.js'></script>
- 启动模块
seajs.use(‘模块id’,function( 模块对象 ){ 业务代码 });
- 定义模块
- 由于需要用到module 当前模块得声明成define(function(require, exports, module)
define(function(require, exports, module){ 模块代码 });
- 引入模块 获取返回值
(暴露接口)- 一个js文件通过 module.exports = 向外返回的对象,让外部拿到
- 外部需要拿到对象 通过require(‘./spinning’);
define(function(require,exports,module){ // 引入模块 var xiaohong = require('./xiaohong'); console.log(xiaohong); })
- 导出模块
//定义一个模块 define(function(require,exports,module){ module.exports = '小红';
2.8.1 定义模块 define
- 先有规范,后有实现
- 在CMD规范中,一个模块就是一个js文件
- define 是一个全局函数,用来定义模块define( factory )
- 对象{}这种方式,外部会直接获取到该对象 define(function(require,exports,module){})
- 字符串 define('字符串')
- 函数function( require, exports, module ){ // 模块代码 } 为了减少出错,定义函数的时候直接把这三个参数写上 duidefine({name:'jack','age':18})
2.8.2 exports 和 module.exports
- 功能:通过给 exports或module.exports动态的挂载变量、函数或对象,外部会获取到该接口
- exports 等价于 module.exports
exports == module.exports true - 可以通过多次给exports 挂载属性向外暴露
- 不能直接给 exports 赋值
eg: module.exports -> 空对象 <- exports 当两者被赋值时 module.exports = '123';exports = '234'; 二者的指向改变 module.exports -> '123';exports -> '234'; seajs内部机制是return module.exports 所以 返回的是module.exports的值
- 如果想暴露单个变量、函数或对象可以通过直接给 module.exports 赋值 即可
2.8.3 启动模块 seajs.use
- 在调用 seajs 之前,必须先引入 sea.js 文件
- 通过 seajs.use() 函数可以启动模块–默认传递一个参数
(‘模块id’[,callback] ) 加载一个模块,并执行回调函数 ( [ ‘模块1’, ‘模块2’ ] [, callback] )
- 加载多个模块,并执行回调函数–传递多个参数 返回值一一对应传递的数组参数顺序
callback 参数是可选的
seajs.use 和 DOM ready 事件没有任何关系
- 最好不要在 define 中 使用 seajs.use
2.8.4 加载模块 require
- require(‘模块id路径字符串’)
- 用于根据一个模块id加载该模块
- 参数必须是一个字符串
- 该方法返回值是 要加载的模块中的 module.exports 对象
- 只能在模块环境define中使用,define(factory)的构造方法第一个参数必须命名为 require
- 不要重命名require函数或者在任何作用域中给 require 重新赋值
2.8.5 模块标识
- 模块标识就是一个字符串,用来标识模块
- 模块标识可以不包含后缀名 .js
- 以 . /或 ../ 开头的相对路径模块,相对于 require 所在模块的路径
不以 ./ 或 ../ 开头的顶级标识,会相对于模块的基础路径解析(配置项中的base)
- 相对路径 ./main.js
绝对路径
- E:/frontend/employcourse/itcastCourse/课堂练习/14node/01-day/demo/10-path/main.js
- 也可以是url地址: http://127.0.0.1:8080/js/a.js/js/a.js
‘base路径’: 默认就是seajs加载的路径 dist路径
- 不能以./开头
- 不能以盘符开头
- 不能以/开头
- 直接是一个名称 可以/结尾
seajs.use(['abc'],function(){}); //abc不存在 默认在这里找 E:/frontend/employcourse/itcastCourse/课堂练习/14node/01-day/demo/seajs-3.0.0/dist/abc.js //默认就是seajs加载的路径 dist路径 //如果在seajs加载的路径 dist路径下存在abc.js文件 就不会报错 否则找不到abc会报错
2.9 高级配置SeaJS
- alias:别名配置
- 起一个别名 可以是绝对路径 不能是盘符目录
html文件: seajs.config({ alias:{ 'jack':'E:/frontend/employcourse/itcastCourse/课堂练习/14node/01-day/demo/11-config/b.js'// 只能做文件的别名 } }); // seajs.use(['main'],function(a){}); seajs.use(['./tmp/main'],function(a){}); main.js文件: define(function(require,exports,module){ require('jack'); })
- paths:路径配置 (只能做文件的别名)
- 给目录起一个别名
使用: require(对应的字段名)
- 给目录起一个别名
html文件: seajs.config({ paths:{ 'dirA':'E:/frontend/employcourse/itcastCourse/课堂练习/14node/01-day/demo/11-config' } }); seajs.use(['./tmp/main'],function(a){}); main.js文件: define(function(require,exports,module){ require('dirA/b.js'); })
- base:基础路径
html文件: seajs.config({ base:'E:/frontend/employcourse/itcastCourse/课堂练习/14node/01-day/demo/11-config/tmp' }); // seajs.use(['main'],function(a){}); seajs.use(['./tmp/main'],function(a){}); main.js文件: define(function(require,exports,module){ require('../b.js'); })
- vars:变量配置
- map:映射配置
- 应用场景:目录层级过深 或者跨盘符的情况就可以使用
3.0 前端模块自动化整合
- 减少请求 js代码合并
- 合并的时候 如何区分模块
gulp gulp-concat
gulp-transport gulp-useref
seajs合并
本身index.html可以引入具体的文件,辨识
//生成的路径 已经根据dest函数指定的路径了 <!-- build:js js/seajs.js --> <script src='../../seajs-3.0.0/dist/sea.js'></script> <!-- build:js js/seajs.js --> //将src目录下的内容构建到dist目录下
4. seajs与require
两者区别:
* seajs:
+ 同步加载
+ 加载机制:延迟加载 | 懒加载 | 滞后
+ 什么时候用什么时候加载
* require.js:
+ 推崇异步加载
+ 加载机制:加载前置 | 优先加载
+ 要用什么就先加载什么use 参数方式 异步加载 让用户不会觉得加载慢
require 特点
- require 加载机制中 模块优先从缓存中获取 如果缓存中存在 就取 不存在 就加载
- 异步调用
- 可以使用: require.async()
不管异步调用多少次 都是同步优先
- 异步就是不阻塞 后续代码执行
两种路径类别
- 补上.js也可以 相对路径 ./main.js
- 绝对路径 带盘符
- 绝对路径还可以是url路径 http://xxx.com
base路径 默认就是seajs加载的路径 dist路径
- 不能以./开头 不能以盘符开头 不能以/开头 直接是一个名称 可以/结尾
高级配置
- alias 指定一个文件的别名 可以是绝对路径 不能是盘符目录
- paths 给目录起一个别名
- 如何使用? require(对应的字段名)
base 基础路径
基于非绝对路径 非相对路径 才去处理应用场景 目录层级过深或者跨盘符的情况就可以使用
前端模块自动化整合
- 减少请求 js代码合并
- 合并的时候 如何区分模块
gulp gulp-concat gulp-seajs-transport gulp-useref
本身index.html 可以引入具体的文件,辨识
将src目录下的内容构建到dist目录
requireJS
- 引入
- 启动模块 requirejs([依赖的模块1,依赖的模块2],function(模块1的返回值,模块2的返回值){
})
* require引入的时候必须是数组 推荐:其他模块define的时候也用数组
* define([依赖的模块1,依赖的模块2],(模块1的返回值,模块2的返回值){}
* 接受模块的返回值,function的参数中接受(模块1的返回值)
* 向外导出 函数内直接returnseajs和requireJS的区别
- 代码的样子:requirejs 依赖向声明前置 seajs声明滞后
- 加载机制:requirejs加载前置 seajs加载滞后(何时用何时加载)
- CMD 和AMD CMD推崇同步 AMD推崇异步
- 时间换空间
-
非模块开发的缺点和模块化开发的优点,模块化开发的理论基础
2019-07-16 16:28:31非模块开发的缺点: 1. 命名易冲突 2.... 3.... 4.... 5....模块化是一种将系统分离成独立功能部分的...模块化开发的优点: 1. 便于协同开发,互不影响 2. 代码结构清晰,可读性强 3. 维护性好 4. 方便单个模块的调...非模块开发的缺点:
1. 命名易冲突
2. 不利于协同开发
3. 代码易读性差,不易维护
4. 代码的复用性差
5. 文件的依赖性太强,因此也容易出错
什么是模块化呢?
模块化是一种将系统分离成独立功能部分的方法,可将系统分割成独立的功能部分,严格定义模块接口、模块间具有透明性。
模块化开发的优点:
1. 便于协同开发,互不影响
2. 代码结构清晰,可读性强
3. 维护性好
4. 方便单个模块的调试
5. 代码的复用性强
6. 降低程序的复杂度,或者是分解了程序的复杂度
7. 职责单一,方便快速替换或者更改内容
模块化开发的理论基础:
1. 面向对象的设计思想,提高了代码的复用性
2. 设计模式
3. 各司其职,减少越俎代庖的事
4. 分解大问题,分步完成一个个的小问题 -
springboot模块化开发
2020-05-20 18:14:36 -
组件化开发和模块化开发概念辨析
2018-01-29 00:57:06组件化开发和模块化开发概念辨析 网上有许多讲组件化开发、模块化开发的文章,但大家一般都是将这两个概念混为一谈的,并没有加以区分。而且实际上许多人对于组件、模块的区别也不甚明了,甚至于许多博客文章专门...组件化开发和模块化开发概念辨析
网上有许多讲组件化开发、模块化开发的文章,但大家一般都是将这两个概念混为一谈的,并没有加以区分。而且实际上许多人对于组件、模块的区别也不甚明了,甚至于许多博客文章专门解说这几个概念都有些谬误。
想分清这两个概念我觉得结合一下软件的渐进式开发场景更容易理解。但是下面的篇幅会比较长,所以我先说结论,不耐烦的同学可以先看:
概念区别
对比
类别 目的 特点 接口 成果 架构定位 组件 重用、解耦 高重用、松耦合 无统一接口 基础库、基础组件 纵向分层 模块 隔离/封装 高内聚、松耦合 统一接口 业务框架、业务模块 横向分块 说明
- 组件:最初的目的是代码重用,功能相对单一或者独立。在整个系统的代码层次上位于最底层,被其他代码所依赖,所以说组件化是纵向分层。
- 模块:最初的目的是将同一类型的代码整合在一起,所以模块的功能相对复杂,但都同属于一个业务。不同模块之间也会存在依赖关系,但大部分都是业务性的互相跳转,从地位上来说它们都是平级的。
因为从代码组织层面上来区分,组件化开发是纵向分层,模块化开发是横向分块,所以模块化并没有要求一定组件化。也就是说你可以只做模块化开发,而不做组件化开发。那这样的结果是什么样的呢?就是说你的代码完全不考虑代码重用,只是把相同业务的代码做内聚整合,不同模块之间还是存在大量的重复代码。这样的成果也算是做到了模块化,只不过我们一般不会这样而已。
和组件模块近似的一对概念是库和框架。库的概念偏近于代码的堆集,是分层的概念,所以对应组件化。框架是结构化的代码,所以应用于模块化。框架是骨,模块化是肉。
比如,ReactiveCocoa是库,只是提供了响应式编码能力,而基于此的MVVM具体实现成果才叫框架,因为框架本身就有架构思想在里面。举例
下面我们举例来说明。
组件化就比如公共的alert框,最初在许多页面都有使用,后面提取出一份相同的代码,其实就是基于代码复用的目的。模块化就比如一个资讯功能,它本身只在这一个地方使用,没有复用的需求,但系统启动的时候要初始化它的数据,首页显示的时候要展示它的数据,显示红点的时候要拉取它的未读数。这样一来应用中就有很多地方涉及到它的代码。如果我们将它看做一个整体,那么资讯模块和主应用的耦合性就非常高了。所以我们也要把它封装成模块,把相关的代码放到独立的单元文件里,并提供公共方法,这就是高内聚的要求。
渐进式开发过程
当然这几个概念在服务端开发和客户端开发领域有些微差别,我下面的例子就从移动端开发的角度上进行辨析。
首先我们定义一个虚拟的产品——一款知识类应用,包含咨询、问答、学院、直播等功能。
接下来我们逐步拆分这个产品。
如果开发时没有考虑任何组件化模块化开发,那么此应用的所有功能都是堆积在一起的,总结起来就是高耦合,低内聚,无重用。
1.组件
那么代码重构的第一步是什么呢?
将重复的代码合并成为一份,也就是重用。
我们来看组件化开发的定义,它的着重点就是重用,那这一步最后的结果就是提炼出一个个组件给不同的功能使用。这里我们可以看一下依赖关系,是具体功能依赖提炼出来的组件,组件本身之间可能也有依赖关系,但一般不多。所以我们总结组件化开发的原则就是高重用,低依赖。当然这只是相对而言。
基于这样的认识,我们甚至于可以把资讯、问答、学院、直播等功能封装成组件,只不过这些组件比较大,依赖可能多些,不过本质上没有多少区别,而且实际上网上许多文章说所的模块化开发其实就是这种组件化的“模块”。2.模块
下面再说模块,按照模块的定义,它是以关注点进行划分的,关注点说到底就是功能,也就是说根据我们上面的例子,资讯、问答、学院、直播可以分成不同的模块。
我们最开始定义这个虚拟产品的时候说,它有三个特点——高耦合、低内聚、无重用。而第一点组件化开发主要是解决了重用问题,提升了部分内聚,而耦合问题则没有涉及。
所以说我们上面可以将这个产品在逻辑上划分为资讯、问答、学院、直播四个模块,但在代码层面上它们却不是四个模块,因为它们的代码都是混杂在一起的。比如产品首页,可能推荐了部分资讯、显示了热门问答、推送了目前的直播,而这些功能的代码则是写在一起的;再比如程序启动的时候,这四个模块都需要初始化一些数据,而初始化数据的代码也是写在一起的;再比如程序需要显示未读消息数,而这几个模块都有自己的未读消息数逻辑。
如果未进行模块化开发的拆分,那么很多时候不同模块的同一类的代码都是直接写在一起的,比如系统启动的时候,我们会在启动方法里直接写多个模块的初始化代码。而模块化开发就是为了解决这一问题,即提高内聚,将分属同一模块代码放到一起;降低耦合,将不同模块间的耦合程度弱化。
高内聚是目标,但是现状是有许多地方会用到多个模块,比如启动的时候会调用四个模块,首页会展示三个模块的界面。如果要高内聚,那么必然需要这些模块为不同的场景提供相同的方法,这就是说所有模块要实现同一套多个接口。这样主应用和模块之间的重耦合就变成了主应用和接口耦合,接口和模块耦合这样的松耦合。
但这样的简单模块只是轻模块,统一接口较少。而统一定义的接口越多,模块和统一接口的耦合就越高,也便是重模块。而我们一般讲的路由问题其实只是解决模块间耦合的问题,并不是模块化开发的必然需求,更多时候是基于产品上的动态化要求,只不过我们一般都会在这个时间考虑这一事情而已,就像我们不会只做模块化开发同时不做组件化开发一样。
讲到这里,模块和组件的区别就已经很明显了。
-
模块化开发简述
2018-08-14 11:42:43模块化开发简述 都说模块化开发为前端发展带来了巨大的进步,然而不熟悉的人看着也是两眼一懵,那其实这到底是什么?好处在哪?我来说说自己的见解吧。 1. 模块化和传统开发的区别 实话讲,其实在我看来,... -
模块化开发笔记
2020-08-10 23:59:56模块化开发存在的一些好处: 灵活构架、焦点分离 方便模块间组合、分解, 提高可重用行 多人协作,不干扰 可分单元测试 模块化符合高内聚、低耦合的构架思想。模块化之间不需要通讯, 可通过接口类(interface)... -
组件化开发和模块化开发
2018-11-27 15:32:36组件化开发和模块化开发实际上是两种编程思想,也可以被认为是两种解决方案。组件化开发注重重用,可以用作实现基础架构的技术方案。举个例子:加入现在我需要实现一个几何图形库,包括图形的生成、修改、删除等基本... -
Vue学习笔记之初识模块化开发
2020-07-25 17:18:56模块化开发声明:type="module" 是为了防止各模块直接变量或方法的冲突,每一个模块都有自己的空间 导出:export对象 导出方式及内容有: 导入:import 对应的导入方式: export default:在应用的... -
模块化开发的好处
2019-07-18 09:03:27我们要进行模块化开发呢? 模块化开发的好处主要有这么几点: 1.使用模块化开发能解决文件之间的依赖关系。 当你引入很多个JS文件的时候,很有可能会不清楚这些JS文件之间的依赖关系,从而导致加载顺序出错。使用... -
angular模块化开发
2017-08-08 15:16:13angular的优势在于模块化开发 -
Android模块化开发
2017-08-18 20:21:02前言项目越做越大,每次编译的时间越来越长,体验特别不好,在加上协同开发的时候,项目管理问题,因此开始了我的Android项目的模块化开发之旅。1.模块化开发的优势 单独模块开发,编译迅速,调试方便 模块之间相互... -
全面了解前端模块化开发
2019-07-09 12:09:03全面了解前端模块化开发前言一、.idea 与 .svn 文件二、package.json 文件三、webpack.config 文件四、README 文件五、异常处理 前言 模块化开发、工程化开发如今也成为前端领域的代名词。但是大部分人只停留在下载... -
前端组件化开发和模块化开发的区别
2018-11-29 22:15:18前端组件化开发和模块化开发的区别 首先,组件化和模块化的意义都在于实现了分治,目前我们开发的项目复杂度不断的上升,早已不是我们一个人能完成的工作,团队合作的话又会产生配合困难等各方面问题,组件化和... -
什么是模块化,模块化开发如何实现?
2017-01-15 17:49:17什么是模块化,模块化开发如何实现? 那么什么是模块化呢,时下流行的库与框架又有哪些在利用模块化进行开发呢? 今天我从以下两个方向来进行描述,如果描述不够准确,还请各位多多指正。 1.什么是模块化? ... -
Android模块化开发配置
2019-05-10 21:14:01模块化 项目由多个模块组成 每个模块都是一个独立的Feature或组件 业务模块间解耦不相互直接依赖 业务模块与公共组件模块通过aar依赖 ...而使用模块化开发则可以解决以上问题: 项目代码结构清... -
Maven模块化开发
2018-04-09 15:32:17前言 最近接触到Maven模块化开发。感觉很不错,虽然还不怎么了解,我估计是为了更好,更快速,更高效,进行开发。而且复用性极强,因为模块之间的耦合度低。 我也看了其它类似的博客,他们把dao层做一个模块,... -
模块化开发怎么做?
2018-08-09 16:59:33模块化开发 首先我们要知道什么是模块化开发? 1. 模块就是一个有特定功能的文件,我们可以通过加载这些模块得到特定的功能 2. 模块化开发就是js的功能分离,通过需求引入不同的文件 3. 模块化开发可以使代码... -
使用ARouter进行Android模块化开发
2019-07-05 19:33:51关于为什么要进行Android模块化开发,网上也已经讲烂了,不过归结起来,大体是可以总结为:在App开发的初期,代码量不大,业务量比较少,一个App作为一个单独的模块进行开发,往往问题不大。但随着业务的增多,代码... -
js-模块化开发总结
2018-10-31 15:21:05模块化开发是什么:模块化开发是一种生产方式,这种方式生产效率高,维护成本低。从软件开发的角度说,模块化开发是一种开发模式,写代码的一种方式,开发效率高,维护成本低。 为什么需要模块化开发:当一个项目... -
什么是模块化开发?模块化开发有哪些方法
2020-08-04 16:20:13前几天面试虾皮问了什么是模块化,没有解答清除。 1.什么是模块化? 简单地说,模块化就是有组织地把一个大程序拆分成独立并互相依赖的多个小文件(模块)。 模块内部有许多私有属性,只向外暴露一部分公开的接口(如... -
Angular的模块化开发
2019-04-16 10:00:15说明:模块化开发会用外链模板,需要跑在服务器环境 上述结构WWW文件夹是项目根目录,子文件夹router-template里是各个抽离出去的模版 和router-template同级的index.html是入口文件,它和模板里的index.html 不是一... -
CSS模块化开发
2011-06-15 07:27:00模块化开发,对于程序员来说已经是个恨熟悉的概念了,在php、jsp、c#等语言中,对于模块化开发都是相当的熟悉了,然而css模块化开发想必很多人还是第一次听到,不错,在如今复杂的web项目中,css是不可缺少的部分,... -
JavaScript 模块化开发历程
2017-05-17 08:08:53# JavaScript 模块化开发 方式简单化实现 + 模块与模块之间相互协作构成了模块系统 - 程序模块化开发的优点 + 开发效率高 * 代码方便重用,别人开发的模块直接拿过来就可以使用,不需要重复开发类似的... -
使用 vue 模块化开发
2020-05-11 22:23:12一、使用 vue/cli 脚手架搭建项目 之前的博客有简介 二、了解单文件组件 使用 vue/cli 脚手架搭建项目之后就可以使用 .vue 后缀的文件,...3. 可以使用现代化的 ESM 模块化更好的进行模块化开发。 一个单文件组件的组成 -
laravel的模块化开发
2018-08-02 00:52:46对于刚接触laravel的人来说,知道了控制器...模块化开发可以把各个功能逻辑分类,各自都有自己的控制器、路由、视图文件夹,而且模块之间互不影响,删除其中一个模块不会对其他模块产生影响。像下图一样,将后台admi...
-
朱老师鸿蒙系列课程第1期-2鸿蒙系统Harmonyos源码架构分析
-
BD 方案 .pdf
-
pandas绘图函数
-
零基础极简以太坊智能合约开发环境搭建并开发部署
-
信息安全风险评估解析.pdf
-
小知识:btn.addEventListener is not a function报错处理
-
Hi3516CV500╱Hi3516DV300 SDK 安装及升级使用说明.pdf
-
华为企业服务风险评估服务主打胶片.ppt
-
jquery如何使用正则
-
Pi Network_Pi币_Pi币挖矿_Pi教程
-
Galera 高可用 MySQL 集群(PXC v5.6 + Ngin
-
深究字符编码的奥秘,与乱码说再见
-
信息安全风险评估培训教材.ppt
-
教你如何摆脱负债上岸,超详细(视频课程)
-
MySQL 高可用工具 heartbeat 实战部署详解
-
python实现链表
-
Bad file descriptor (C:\ci\zeromq_1602704446950\work\src\epoll.cpp:100)
-
linux c 进程间通信 信号灯 程序源码
-
文本文件单词的检索与计数实验预习
-
NFS 网络文件系统