【问题标题】:Does RequireJS loads previously loaded files (.Js or .html) from cache?RequireJS 是否从缓存中加载以前加载的文件(.Js 或 .html)?
【发布时间】:2016-04-08 22:12:24
【问题描述】:

我在我的应用中使用 requireJs。我面临一个场景,我想清除它。 我正在根据位置 url 或 routes 加载特定模板(视图)及其依赖的 js 文件。请参阅以下代码示例。

routes: {
            '/': {
                templateUrl: 'views/login.html',
                dependencies: [
                    'scripts/controllers/login.js',
                ]
            },
            '/abc-view': {
                templateUrl: 'views/abc.html',
                requireLogin: true,
                dependencies: [
                    'scripts/controllers/abc.js',
                    'scripts/controllers/xyz.js',
                ]
            },
            '/xyz-view': {
                templateUrl: 'views/xyz.html',
                requireLogin: true,
                dependencies: [
                    'scripts/controllers/xyz',
                    }
        }

当我更改为 xyz 视图时,将加载 xyz.js 文件。我的问题是,当我更改为 abc 视图时,是否会加载 xyz.js 如果是,那么它会从缓存中加载吗?

我在 newtwork 选项卡中看到它再次加载相同的文件,即 xyz.js,而不是从缓存中与已经包含在一个模板中的 html 模板相同 ng-inlcude 它不会从缓存中加载。

任何帮助将不胜感激。谢谢。

我的申请流程如下: index.html

<script type="text/javascript" src="libs/requirejs/require.js" data-main="config.js"></script>

Config.js 中,我正在手动引导应用程序。

requirejs.config({

  "paths":{
        "angular": "libs/angular/angular.min",
        "angular-route":"libs/angular-route/angular-route",
        "angular-sanitize":"libs/angular-sanitize/angular-sanitize",
        "jquery-ui":"libs/jquery-ui/jquery-ui.min",                
        "ngAnimate":"libs/angular-animate/angular-animate.min",
                "angularSrapCore":"libs/angular-strap/dist/angular-strap.min",
        "angularStrap":"libs/angular-strap/dist/angular-strap.tpl.min"
    },
    "shim": {
            "angular": {
              "exports": "angular"
            },
            "drutasApp": {

                    deps: ["angular", "angular-route","angular-sanitize","jquery-ui","ngAnimate"]

            },
            "angular-route": {
                    deps: ["angular"]
            }
        }
});

require(['angular','app'     
                    ], function (angular) {
    angular.element(document).ready(function () {console.log("app bootstraped");
            angular.bootstrap(document, ['app']);
        });
});

app.jsconfig.js在同一目录下,代码如下...

define(['scripts/routes.js','scripts/services/dependencyResolverFor.js'], function(config, dependencyResolverFor)
{
    var app = angular.module('app', ['ngRoute','ngAnimate','ngSanitize']);

    app.config(
    [
        '$routeProvider',
        '$locationProvider',
        '$controllerProvider',
        '$compileProvider',
        '$filterProvider',
        '$provide',

        function($routeProvider, $locationProvider, $controllerProvider, $compileProvider, $filterProvider, $provide)
        {
            app.controller = $controllerProvider.register;
            app.directive  = $compileProvider.directive;
            app.filter     = $filterProvider.register;
            app.factory    = $provide.factory;
            app.service    = $provide.service;
            app.constant   = $provide.constant;

            $locationProvider.html5Mode(false);

            if(config.routes !== undefined)
            {
                angular.forEach(config.routes, function(route, path)
                {
                    $routeProvider.when(path, {
                        templateUrl:route.templateUrl,
                        resolve:dependencyResolverFor(route.dependencies)
                    });
                });
            }

            if(config.defaultRoutePaths !== undefined)
            {
                $routeProvider.otherwise({redirectTo:config.defaultRoutePaths});
            }
        }
    ]);

   return app;
});



`routes.js` is as following...

define([], function()
{
    return {
        defaultRoutePath: '/',
        routes: {
            '/': {
                templateUrl: 'views/home.html',
                dependencies: [
                    'scripts/controllers/home'
                ]
            },
            '/abc-view': {
                templateUrl: 'views/abc.html',
                dependencies: [
                    'scripts/controllers/abc',
                    'scripts/controllers/xyz'
                ]
            },
            '/xyz-view': {
                templateUrl: 'views/xyz.html',
                dependencies: [
                    'scripts/controllers/xyz'
                ]
            }
        }
    };
});

dependencyResolver.js

    define([], function()
{
    return function(dependencies)
    {
        var definition =
        {
            resolver: ['$q','$rootScope', function($q, $rootScope)
            {
                var deferred = $q.defer();

                require(dependencies, function()
                {
                    $rootScope.$apply(function()
                    {
                        deferred.resolve();
                    });
                });

                return deferred.promise;
            }]
        }

        return definition;
    }
});

【问题讨论】:

  • 我不知道路由对象下的dependencies 属性是什么?我所能做的就是猜测您没有使用 requireJS 来加载您的 xyz.js 。因为如果提供这样的字符串 requireJS 会将 .js 添加到字符串的末尾,因此您将无法加载 'scripts/controllers/xyz.js.js' 。我可以帮助你解决这个问题,但我需要更多关于你正在使用的router 的名称的信息(对我来说不像ui-routeng-route)。
  • 如果我没有在最后添加 .js 扩展名,那么如果没有使用 requireJS 应该会出现错误。如果我省略 .js 扩展名,那么加载它就没有问题。如果我写错了,我要求请纠正。
  • 如上所述。 requireJS 不需要 .js 扩展。它将自行添加此扩展。 ---- 对于 JS 文件 如果您从 requireJS 加载 js 文件,它将不会再次加载该 js 文件。 ---- FOR HTML FILE requireJS 与此无关,但有角度。并且行为将是相同的。 HTML 视图将被重用,而不会触发任何 HTTP 请求。
  • 是的,这就是为什么我问你使用的router 是什么?因为看起来你根本没有使用 requireJS。我尽可能需要你的真实代码,js文件给你答案。

标签: angularjs requirejs angular-ui-router require


【解决方案1】:

我的问题是当我更改为 abc 视图时,是否会加载 xyz.js

不,requireJS 将判断要获取的脚本标签的最终URL。如果之前已经加载过,requireJS 不会做任何事情。


如果是,那么它会从缓存中加载吗?

不太可能使用缓存,但requireJS 只是检测之前是否加载了具有相同URL 的相同文件。如果之前加载过,requireJS 只会执行你的js而不加载任何东西。


我在 newtwork 选项卡中看到它再次加载相同的文件,即 xyz.js,而不是从缓存中与已经包含在 ng-inlcude 的一个模板中的 html 模板相同,它不会从缓存中加载。

在查看您的代码时,requireJS 必须用于获取依赖项。这种行为不会发生,除非requirejs.undef() 在某处被调用。或者那是 requireJS 的旧版本,其中模块的 URL 没有被跟踪,&lt;script&gt; 无论条件如何都必须加载。


注意我不确定 requireJS 的 2.1.x 之前版本的行为。

【讨论】:

  • 我的问题是,假设我在 abc 视图上,然后我转到 xyz 视图,当我刷新页面表单浏览器时是否加载 abc.js 文件?
  • 当一个reload/refresh 的页面涉及时。不,requireJS 与缓存没有任何关系。您需要在服务器端执行此操作。
  • 有没有办法实现它...?
  • 我不太确定你在问什么,但可以通过response headers 来完成。我用ETagLast-Modified 为我的应用程序做过一次。这也取决于您的服务器端运行的内容,例如Apache...等... ---- 不管怎样,requireJS 与浏览器的缓存无关。
  • 我在问,假设我在 abc 视图 并且它们的依赖关系 JS 文件是 abc.js 。然后我转到 xyz 视图,其依赖项 JS 文件是 xyz.js 。当我重新加载页面 xyz.js 加载成功但我也想加载 abc.js 文件,因为在这个视图中(xyz 视图)我还需要 abc.js 文件。
猜你喜欢
  • 2014-04-09
  • 2013-02-02
  • 2022-01-23
  • 2012-08-20
  • 1970-01-01
  • 2014-04-09
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多