RequireJS使用xhr加载脚本而不是<script>标签

时间:2016-02-23 14:46:04

标签: javascript angularjs ajax requirejs lazy-loading

我正在尝试使用 requirejs延迟加载Angular控制器

&#xA;&#xA;

这是我的解析代码正在工作正如预期的那样

&#xA;&#xA;
  require(['controllers /'+ controllerName],function(data){&#xA; $ stateParams.controllerName = data.name || controllerName;&#xA; deferred.resolve();&#xA;});&#xA;  
&#xA;&#xA;

但此方法正在添加<代码>&lt; script&gt; 标记到 head 并带有请求的URL

&#xA;&#xA;

我想使用 XHR加载以便它不会添加任何脚本标记或显示在资源中。

&#xA;&#xA;

我试过这样的

&#xA;&#xA;
  require(['text!controllers /'+ controllerName +'。js'],function(data){&#xA; var funcData = new Function(data)(); //期望数据为字符串&#xA; $ stateParams.controllerName = funcData.name || controllerName;&#xA; deferred.resolve();&#xA;});&#xA;  
&#xA;&#xA; < p>但是因为requirejs我得到错误正在尝试加载 /text.js 而不是 /controllers/nameOfController.js

&#xA;&#xA;

有没有办法修复或其他更好的方法吗?&#xA;(我想只用 XHR 加载脚本)

&#xA;

2 个答案:

答案 0 :(得分:0)

您的项目中是否有requirejs text依赖项?

将查找text.js,如果不存在则会出错。

答案 1 :(得分:0)

好吧..最后这是我在不违反requirejs的实际功能的情况下想出来的。现在它使用xhr加载脚本..

将其添加到main.js以覆盖原始方法。

注意:仅在PROD中使用此功能,否则将在浏览器中松开脚本调试。

require.load = function (context, moduleName, url) {
    var config = (context && context.config) || {},
        isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document),
        isWebWorker = !isBrowser && typeof importScripts !== 'undefined',   
        makeError = function (id, msg, err, requireModules) {
            var e = new Error(msg + '\nhttp://requirejs.org/docs/errors.html#' + id);
            e.requireType = id;
            e.requireModules = requireModules;
            if (err) e.originalError = err;
            return e;
        },
        xmlhttp;
    if (isBrowser) {
        if (window.XMLHttpRequest) xmlhttp = new XMLHttpRequest();
        else xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == XMLHttpRequest.DONE) {
                if (xmlhttp.status == 200) {
                    try {
                        new Function(xmlhttp.responseText)();
                        context.completeLoad(moduleName);
                    } catch (e) {
                        context.onError(makeError('scripterror', 'executing script failed for ' + moduleName + ' at ' + url, e, [moduleName]));
                    }
                }
                else context.onError(makeError('notloaded', 'loading scripts failed for ' + moduleName + ' at ' + url, xmlhttp.status, [moduleName]));
            }
        }
        xmlhttp.open("GET", url, true);
        xmlhttp.send();
    } else if (isWebWorker) {
        try {
            importScripts(url);
            context.completeLoad(moduleName);
        } catch (e) {
            context.onError(makeError('importscripts', 'importScripts failed for ' + moduleName + ' at ' + url, e, [moduleName]));
        }
    }
};