使用ocLazyLoad加载CodeMirror:serie: true无法保证模块加载顺序
ocLazyLoad加载CodeMirror时模块顺序问题的解决方案
你遇到的问题其实是对serie: true参数的作用理解有误——它只负责控制单个模块内部的文件按顺序加载,而不是多个模块之间的加载顺序。所以你分开定义codeMirror1和codeMirror2两个模块时,即使全局设置了serie: true,这两个模块依然会并行加载,导致依赖于codemirror.min.js的xml.min.js等文件可能先于主文件加载完成,从而报错。
这里有两种靠谱的解决方法:
方法一:将所有依赖文件放入同一个模块,利用serie: true控制内部顺序
把CodeMirror的主文件、样式和所有依赖的模式文件都放在同一个模块里,然后给这个模块设置serie: true,这样模块内的文件会严格按照数组顺序依次加载,确保codemirror.min.js加载完成后才会加载后续的依赖文件:
$ocLazyLoadProvider.config({ debug: true, modules: [{ name: 'codeMirror', serie: true, // 此参数作用于当前模块内的files数组,保证顺序加载 files: [ "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.36.0/codemirror.min.css", "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.36.0/codemirror.min.js", "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.36.0/mode/xml/xml.min.js", "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.36.0/mode/htmlmixed/htmlmixed.min.js", "https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.36.0/mode/css/css.min.js" ] }] });
之后你只需要加载codeMirror这一个模块即可:
$ocLazyLoad.load('codeMirror').then(function() { // 在这里初始化CodeMirror });
方法二:手动链式加载多个模块
如果必须把文件拆分成不同模块,那需要手动控制模块的加载顺序,先加载主模块codeMirror1,在它的加载完成回调里再加载依赖模块codeMirror2:
// 先加载主模块 $ocLazyLoad.load('codeMirror1').then(function() { // 主模块加载完成后,再加载依赖模块 return $ocLazyLoad.load('codeMirror2'); }).then(function() { // 所有依赖都加载完成,初始化CodeMirror });
这种方式通过Promise链式调用,确保了模块之间的加载顺序,避免依赖文件提前加载的问题。
内容的提问来源于stack exchange,提问作者SoftTimur
相关产品推荐
相关产品推荐

