`
yiminghe
  • 浏览: 1466356 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

模块的静态与动态循环依赖

 
阅读更多

场景:

 

循环依赖 我是不支持的,但现实中似乎又确实需要循环依赖,例如前端的选择器场景 (ie<8):

 

首先实现了 DOM 模块来保证各个浏览器的兼容性以及 api 的易用性,其中包含必要简单的选择器逻辑

 

然后实现了高级选择器模块,但这并不是最常用,为了效率该模块是不放入核心 DOM 模块中的,而选择将它作为独立模块 :selector,显然 selector 模块依赖于 DOM 进行 dom 遍历.

 

S.add("selector",function(){

},{requires:["dom"]});

 

而 DOM 中会进行判断是否当前选择器字符串过于负责而自己不能处理,需要高级选择器模块介入:

 

S.add("dom",function(S,Selector){
  return {
      querySelectorAll:function(q){
           if(isAdvanced(q)){
               return Selector.querySelectorAll(q);
           } else{
               // simple logic
           }
      }
  };
},{requires:["selector"]});

 

这时就形成了循环依赖

 

解决:

 

其实我们需要区分模块间到底是静态依赖还是动态依赖,静态依赖指模块的初始化就需要另一个模块参与,而动态依赖则是指直到模块的运行期才会需要调用另一个模块,对于静态循环依赖这个问题我觉得是无解的,而对于动态循环依赖则是完全可以绕过.

 

动态循环依赖可以参考类似 serviceloader 的做法,DOM 模块完全可以动态取得高级选择器接口的一个具体实现模块,而selector 模块实现接口并保证自己可以被找到即可:

 

DOM 模块:

 

S.add("dom",function(S){
  return {
      querySelectorAll:function(q){
           if(isAdvanced(q)){
               return S.ServiceLoader.load("selector").querySelectorAll(q);
           } else{
               // simple logic
           }
      }
  };
});

 

高级选择器模块仍可以依赖 DOM ,实现 querySelectorAll 接口(概念上,动态语言完全没必要),并注册自己即可.

 

而 ServiceLoad.load 完全可以和模块系统结合在一起,用户可以通过模块系统静态或动态载入一些高级附加模块,ServiceLoad.load 询问模块系统即可得到实现了高级选择器接口的具体模块.

 

 

 

refer:

 

static vs dynamic 1 ,2

 

circular dependency wiki

 

java.util.ServiceLoader api

 

 

 

分享到:
评论
2 楼 yiminghe 2011-07-25  
limu 写道
我也遇到这个问题,在seajs里遇到类似的问题.
把动态依赖的require改为require.async.
因为初始时一定是require过这俩,require.async的目标模块在调用时肯定已经被载入
所以调用时就是同步的,可以按同步的写法继续写余下的代码,而不用封装到回调中.

哈,kissy 一直是通过 S.require("sizzle") 来解决的,不过看到后端语言的对应支持很踏实
1 楼 limu 2011-07-25  
我也遇到这个问题,在seajs里遇到类似的问题.
把动态依赖的require改为require.async.
因为初始时一定是require过这俩,require.async的目标模块在调用时肯定已经被载入
所以调用时就是同步的,可以按同步的写法继续写余下的代码,而不用封装到回调中.

相关推荐

    lcc循环依赖重磅资料

    6. **循环引用检测工具**:利用静态代码分析工具,如SonarQube,检测并提示潜在的循环依赖。 在学习"lcc循环依赖"的资料时,你会更深入地了解如何识别和处理这类问题,从而提升代码质量和可维护性。这不仅有助于...

    joomla图片循环播放模块

    图片循环播放模块就是其中的一种模块,用于展示静态或动态内容,如广告、图片滑块或新闻更新。 在Joomla中,图片循环播放模块的安装和配置通常包括以下步骤: 1. 下载:首先,你需要从Joomla的官方扩展库或第三方...

    适用于分布式静态检测的Java代码依赖性分析技术.zip

    1. **控制流分析**:分析程序执行路径,找出可能的控制依赖,帮助识别条件分支和循环依赖。 2. **数据流分析**:关注变量的使用和传递,揭示数据依赖关系,有助于找到可能的副作用和并发问题。 3. **包和类层次结构...

    一种基于逻辑的Java模块依赖图构建工具.zip

    本文将深入探讨一种基于逻辑的Java模块依赖图构建工具,通过这种方式,开发者可以清晰地理解各个模块之间的关系,有助于优化代码结构,避免循环依赖等问题。 首先,理解“模块依赖图”是至关重要的。在Java世界中,...

    详解CommonJS和ES6模块循环加载处理的区别

    与 CommonJS 不同,ES6 模块的加载是**异步的**,并且是**静态的**。这意味着在解析时,`import` 语句会被转换成指向模块的引用,而不是实际的值。只有在真正需要模块的值时,才会去获取。 **循环加载处理的区别:*...

    伪静态的实现及伪静态的意义.ASP.NET

    在ASP.NET环境中,实现伪静态可以通过IIS的URL重写模块或者使用如Route等编程方式实现,将动态URL映射到对应的处理方法,从而达到伪静态的效果。总的来说,伪静态技术是现代Web开发中一种重要的优化手段,它在兼顾...

    独立团-手把手教你封装模块

    注意控制模块间的依赖关系,避免循环引用或过度耦合。 6. **持续优化**:随着时间的推移,根据反馈和需求变化,不断优化模块设计,使其更高效、更易用。 在"独立团"的教学资源中,你可能将会学习到如何在Python、...

    dpdm:检测 TypeScript 项目中的循环依赖

    用于JavaScript和TypeScript项目的静态依赖项分析器。 特征 支持CommonJS 、 ESM 。 完全支持JavaScript和TypeScript 。 支持 TypeScript 。 支持忽略 TypeScript 类型依赖 轻量级:使用解析所有模块。 快速:...

    QQ空间闪动模块

    2. **增强互动性**:动态的模块比静态的图片更吸引人眼球,可以提高访客在空间停留的时间,从而增加互动的可能性。 3. **展示技术能力**:对于一些具有编程或设计技能的用户来说,制作和分享自己创作的闪动模块是一...

    制作静态库所用到的资料

    一、静态库与动态库的区别 1. 静态库:在编译时会被链接到目标程序中,成为可执行文件的一部分。这意味着程序较大,但运行时不需要依赖外部库,适合于不支持动态库的环境或需要独立运行的应用。 2. 动态库:在运行时...

    JavaScript前端开发模块化教程_PPT.rar

    使用`import`导入模块,`export`导出模块,具有静态链接特性,编译时就能确定依赖关系。 4. SystemJS:SystemJS 是一个运行时模块加载器,可以动态加载各种模块格式,包括ES6、CommonJS和AMD。它允许在浏览器和Node...

    swift-Depcheck是Swift项目的依赖性分析器工具

    通过这个图,开发者可以清晰地看到各个模块之间的相互作用,发现潜在的问题,比如循环依赖或者不常用的库。 使用Depcheck,你可以: 1. **识别未使用的导入**:Depcheck可以找出那些在代码中未被引用的`import`...

    前端开源库-grunt-madge

    `grunt-madge`是一个非常有用的工具,它作为Grunt插件帮助开发者检测AMD(Asynchronous Module Definition)和CommonJS模块中的循环依赖问题。循环依赖是编程中常见的陷阱,如果不妥善处理,可能会导致内存泄漏、...

    Python-整个程序静态堆栈分析

    如`ast`模块(抽象语法树)来解析和遍历源代码,`pylint`或`flake8`来进行代码质量检查,` pudb `或`ipdb`作为强大的调试器提供类似的功能,虽然它们更偏向动态调试,但在某些情况下也可用于静态分析。 在提供的...

    CommonJS和ES6模块的区别

    - 在CommonJS中,当发生循环依赖时,每个模块的加载都会创建一个空对象,并立即暴露出去,这样在另一个模块尝试访问它时,至少可以得到一个空的对象而不是报错。 - 这种机制允许开发者处理循环依赖问题,但也可能...

    静态网页内容抓取深度搜索

    静态网页是指不依赖服务器端脚本动态生成,而是预先生成HTML代码并存储在服务器上的网页。这种类型的网页在内容获取上相对简单,因为它们的内容在用户请求时不会改变。 静态网页内容抓取通常涉及到网络爬虫(Web ...

    静态代码分析工具汇总

    2. **静态结构分析**:分析代码的结构,例如模块间的关系、循环依赖、复杂度等,评估代码的可维护性和可扩展性。 3. **代码质量度量**:量化代码的质量,如可读性、可维护性、效率等,帮助开发者识别需要改进的地方...

    关于前端模块的介绍说明.rar

    在实际开发中,我们还需要考虑如何有效地管理模块间的依赖关系,避免循环依赖。同时,模块化的应用也涉及到代码的懒加载、按需加载,以提高页面加载速度和用户体验。在大型项目中,模块热更新、模块状态管理(如...

    requirejs模块化

    10. **最佳实践**:合理规划模块结构,避免循环依赖,使用`config`配置全局变量,避免在模块之间直接共享状态,以保持模块的独立性。 综上所述,RequireJS作为JavaScript的模块化解决方案,通过AMD规范,为Web应用...

    静态软件缺陷预测方法研究2

    度量元是静态软件缺陷预测的基础,它们通常包括代码复杂性、循环复杂度、类的耦合性、包的依赖性等。通过这些度量,可以量化地评估代码的健壮性和易出错性。例如,圈复杂度(Cyclomatic Complexity)能反映代码结构...

Global site tag (gtag.js) - Google Analytics