【问题标题】:Can a javascript file be unloaded after loaded with Ext.Loader.loadScript?使用 Ext.Loader.loadScript 加载后可以卸载 javascript 文件吗?
【发布时间】:2013-07-25 20:00:53
【问题描述】:

如果用户选择某个选项,我只需要 three.js 库。它是这样加载的。 (并像这样调用“var motion = bd.code.tcCrowdSim.wglRndr(a,b)”。使用后可以卸载吗?tia

Ext.define('bd.code.tcCrowdSim', {

statics: {
    wglRndr: function (caller, data) { 
        this.preLoader(caller, data);
    },

    preLoader: function(caller, data) {
        Ext.Loader.loadScript({
            url: 'js/Three.js',
            scope: this,
            onLoad: function() {
                Ext.Loader.loadScript({
                    url: 'js/ShaderExtrasCrowd.js',
                    scope: this,
                    onLoad: function() {
                        Ext.Loader.loadScript({
                            url: 'js/PostProcessingCrowd.js',
                            scope: this,
                            onLoad: function() {
                                this.crowd2(caller, data);
                             }
                        })
                    }
                })
            }
        })
    },

    crowd2: function(caller,data) { .....

....不确定编辑原件或对特定答案添加评论是否是最好的沟通方式?

init : function(){
    var len = $('script[src*="js/Three2.js"]').length;
    if (len === 0) {
        console.log('SCRIPNOTLOADED');
        this.preLoader(this.caller, this.data); // preLoader.onLoad calls doScene
    }
    else{
        this.doScene(this.caller, this.data);
    }
},

代码检测js是否加载,并添加

preLoader: function(caller, data) {
    Ext.Loader.setConfig({
        preserveScripts: false
    })
    Ext.Loader.loadScript({ .....

每次提示脚本正在刷新时都强制加载?因为它是用

开始的
this.motion = bd.code.tcCrowdSim.wglRndr(a,b)

来自 Deft ViewController,想知道何时应用“False to remove and optional-garbage-collect asynchronously loaded scripts”?开销方面,包含所有 webGL/Threejs 内容的画布对象是在模态的 extjs 弹出窗口上创建的,因此用户关闭窗口以继续。在这一点上说没有关联的 html/dom 足迹是真的吗?也许这比加载两个版本的 ThreeJS 更重要?

【问题讨论】:

    标签: extjs


    【解决方案1】:

    Loader.loadScript() 将一个新的<script> 标记附加到 DOM(在本例中为 HTML 头),然后浏览器运行该脚本。

    您可以从 DOM 中删除脚本,但 AFAIK 在大多数浏览器中,在加载的脚本中声明的变量/函数/对象仍然可用。你可以delete他们。

    这是一个测试,从 ExtJS 加载 jQuery(我不知道你为什么要这样做;):

    http://jsfiddle.net/ny49m/5/

    Ext.Loader.setConfig({
        enabled:true
    });
    
    console.log(typeof jQuery == 'undefined'); //true
    
    Ext.onReady(function(){
    
        Ext.Loader.loadScript({
    
          url:'http://code.jquery.com/jquery-1.10.1.min.js',
    
          onLoad:function(){
    
            console.log(typeof jQuery == 'undefined'); //false
    
             //remove the script tag from the DOM:
             var scripts = document.getElementsByTagName('script');
             for(var i=0; i<scripts.length; i++){
                if(scripts[i].src.indexOf('jquery') != -1){
                    scripts[i].parentNode.removeChild(scripts[i]);
                }
             }
    
             console.log(typeof jQuery == 'undefined'); //false
    
             delete(jQuery); 
    
             console.log(typeof jQuery == 'undefined'); //true
        }
    });
    
    });
    

    【讨论】:

    • 我写了一大段关于一旦执行脚本就无法卸载的问题,但有可能delete 引用它已经离开......在意识到这有点离题之前:/ 现在我认为 OP 的答案都归结为:在什么情况下可以轻松删除 Ext 类?我的意思是,我怀疑 ClassManager 等在内部保留了很多对构造函数的引用......对此有任何了解吗?
    • 这些方法适用于可观察对象和组件,它们不适用于Ext.Class
    • 这将是最好的候选人,IMO:docs.sencha.com/extjs/4.2.1/#!/api/… 但是我没有任何经验,所以我不能肯定。
    • 不过,看看这个函数的代码,它还是很有希望的。
    【解决方案2】:

    我不会教你如何“卸载脚本”是不可能的(但如果你愿意,你可以得到别人的教诲:How to unload a javascript from an html?)。

    所以,您真正想要的不是从内存中卸载 文件 或从 DOM 中卸载标签。您真正想要的是 delete 此脚本创建的所有引用(变量),以便垃圾收集器将其视为终止目标。

    如果你的代码是这样的 vanilla javascript,那可能会相对容易:

    // Manual Ext.ns
    window.bd = window.bd || {};
    bd.code = bd.code || {};
    
    bd.code.tcCrowdSim = { ... };
    

    这就够了:

    delete bd.code.tcCrowdSim;
    

    现在,考虑到bd.code.tcCrowdSim 是一个Ext 类,Ext 内部保留了大量对它的引用,所以这还不够。在与 Neil 讨论之后,Ext 似乎为此提供了一个功能:Ext.ClassManager.undefine

    如果 Ext 开发者是可靠的,那么这应该可以解决问题:

    Ext.ClassManager.undefine('bd.code.tcCrowdSim');
    

    话虽这么说...使用 Ext 类加载系统来延迟加载可选脚本真的是个好主意吗?考虑到有一天你可能会最终将你的应用程序编译成一个大的缩小的 javascript 文件,这个类将出现在其中......这还没有谈到一个 Ext 类在内存环境中的低得离谱的内存影响现代客户端,无论是小型智能手机...

    【讨论】:

    • 与您一起讨论这一切。我需要旧的 r50 的 Three.js 和最新的 r59 也取决于选择的数据可视化。两个概率的开销都可以。 ``
    • 伙计,不要白白失去你的冷静,你的动脉和试图帮助你的人可能不会喜欢它......在我发表评论之前你有没有预料到编译问题?而且,只是好奇,我的回答对您有帮助还是完全没有帮助?
    • 完全不确定我的评论如何让您相信我“失去了冷静”? :-) 完全相反....关于所有答案的基本信息...不确定`` 是如何进入那里的...这是评论中的诅咒吗?您对编译的事情是正确的.....在事情的计划中,ThreeJs 的 2 个副本可能很小。
    • 很高兴我当时没有给你发火 ^^ 那将是最后的干燥“好的”,并且没有“谢谢”或我们通常在感激的 cmets 中看到的这种东西,那让我误解了你的语气。所以很高兴你的问题取得了进展。
    • 说实话,我不完全理解您最初评论中的最后一句话......作为一个非英语母语的人(也许你也是?),这可能是我错误的根源。对整件事感到抱歉。
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2020-07-15
    • 2013-07-31
    • 2014-01-11
    • 1970-01-01
    相关资源
    最近更新 更多