Подтвердить что ты не робот

Как очистить кеш шаблонов

В Angular 2, как вы очищаете кеш шаблона? Есть тонны ответов для Angular 1, но нет для 2.

Проблема заключается в том, что когда я изменяю содержимое html-страниц, на которые ссылается templateUrl на любых компонентах, html-страницы не изменяются в браузере, пока я не перейду вручную к templateUrl в браузере и нажмите reload. Я знаю, что вы можете отключить кеш браузера для решения этой проблемы во время разработки, но я обеспокоен тем, что пользователи могут видеть устаревшую страницу html, если они кэшируются в браузере, когда я перехожу к обновлению веб-сайта с помощью Angular 2.

Вот ссылка на вопросы для Angular 1 AngularJS отключает частичное кэширование на dev-машине

Ниже приведен фрагмент, и у меня возникают проблемы с обновлением app.html при изменении его содержимого.

@Component({
    selector: 'photogallery-app',
    templateUrl: './app/app.html',
    directives: [ROUTER_DIRECTIVES, CORE_DIRECTIVES]
})
4b9b3361

Ответ 1

Сначала импортируйте TemplateCompiler.

import { TemplateCompiler } from 'angular2/src/compiler/template_compiler';

Затем введите TemplateCompiler в свой конструктор.

constructor(private _templateCompiler: TemplateCompiler)

Наконец, используйте это, чтобы очистить кеш. Обратите внимание, что это очищает все шаблоны.

this._templateCompiler.clearCache();

ОБНОВЛЕНИЕ: Angular 2 Бета 17

Сначала импортируйте RuntimeCompiler.

import { RuntimeCompiler} from 'angular2/src/compiler/runtime_compiler';

Затем введите в свой конструктор RuntimeCompiler.

constructor(private _runtimeCompiler: RuntimeCompiler)

Наконец, используйте это, чтобы очистить кеш. Обратите внимание, что это очищает все шаблоны.

this._runtimeCompiler.clearCache();

ОБНОВЛЕНИЕ: Angular 2 RC 1

Сначала импортируйте RuntimeCompiler.

import { RuntimeCompiler} from '@angular/compiler/src/runtime_compiler';

Затем введите в свой конструктор RuntimeCompiler.

constructor(private _runtimeCompiler: RuntimeCompiler)

Наконец, используйте это, чтобы очистить кеш. Обратите внимание, что это очищает все шаблоны.

this._runtimeCompiler.clearCache();

ОБНОВЛЕНИЕ: Angular 2 RC 4

Сначала импортируйте RuntimeCompiler.

Обратите внимание на изменение пути от RC1. Путь, указанный для RC1, будет вызывать ошибки при вызове .ClearCache(), если используется с RC4

import { RuntimeCompiler} from '@angular/compiler';

Затем введите RuntimeCompiler в свой конструктор

constructor(private _runtimeCompiler: RuntimeCompiler)

Наконец, используйте это, чтобы очистить кеш. Обратите внимание, что это очищает все шаблоны.

this._runtimeCompiler.clearCache();

UPDATE: Angular 2.0.0 (окончательная первоначальная версия)

Это невозможно. У меня есть приложение, которое обслуживает один набор шаблонов для зарегистрированных пользователей, а другой набор для тех, которые не вошли в систему. После обновления до 2.0.0 я не вижу возможности выполнить ту же задачу. Хотя я пытаюсь найти лучший способ перепроектировать приложение, я прибег к этому:

location.reload();

Это работает (но, очевидно, перезагружает всю страницу).

Ответ 2

В Angular 2.0.2 мы можем очистить кеш шаблона следующим образом:

Импорт

import { Compiler } from '@angular/core';

Инжектор зависимостей:

constructor(private _compiler: Compiler) {
}

Использование:

this._compiler.clearCache();

Примечание. Я считаю, что это решение работает от Angular 2.0.0 (окончательная первоначальная версия)

Обновление

В текущих версиях (4.x) Angular clearCache() for больше не работает. Это уже было сообщено в Angular Github (by @Olezt) и, возможно, будет исправлено в будущем.

Объяснение функционального назначения метода clearCache():

Еще один непонятный вопрос - функциональное назначение метода clearCache(), clearCache() несет ответственность за удаление templateUrl, stylesUrl и т.д., указанных в @Component. (Я использую его, чтобы отбросить представление, загруженное в templateUrl, и запросить обновленное представление сервера, в моем проекте представление, полученное в результате этого запроса, изменено в соответствии с пользователем обмена/разрешениями, например. Таким образом, необходимо отказаться от предыдущего загружен.)

clearCache() не действует в кеше браузера или что-либо за пределами Angular, он действует только в кешках @Component, @NgModule и т.д. Angular, не более.

Ответ 3

Следующий вопрос о стеке над потоком обеспечивает отличную стратегию для решения этой проблемы, добавив параметр версии в Url.

Заставить браузер очистить кеш

Это теоретически должно отлично работать для выпуска продукции. Тогда для разработки я могу просто отключить кеш браузера.

Ответ 4

gulpfile.js

var gulp = require('gulp'),
    replace = require('gulp-replace');

    gulp.task('release', function() {
        // cache busting for html
        gulp.src([app/**'])
            .pipe(replace(/\.html.*'/g, '.html?v' + Date.now() + "'"))
            .pipe(gulp.dest('web/app'));

        // cache busting for js
        gulp.src(['main.html'])
            .pipe(replace(/version = (\d+)/g, 'version = ' + Date.now()))
            .pipe(gulp.dest('src/AppBundle/Resources/views'));
    });

main.html

<html>
    <head>
        <script src="{{ asset('js/systemjs.config.js') }}"></script>
        <script>
            var systemLocate = System.locate,
                version = 1477001404442;
            System.locate = function(load) {
                var System = this;

                return Promise.resolve(systemLocate.call(this, load)).then(function(address) {
                    return address + System.cacheBust;
                });
            };
            System.cacheBust = '?v=' + version;

            System.import('app').catch(function(err){ console.error(err); });
        </script>
    </head>
</html>

ANY-component.ts

@Component({
    selector: 'any-selector',
    templateUrl: '/app/template.html'
})

тогда просто выполните gulp release, и вы хорошо поедете вживую

Ответ 5

У меня был аналогичный question. В качестве быстрого взлома я решил это, введя глобальный var в модуле типа export var fileVersion = '?tmplv=' + Date.now(); - во время разработки и изменив его для производства - и использую его в таких компонентах, как:

@Component({
    selector: 'my-component',
    templateUrl: '/app/templates/my-component.html' + fileVersion,
})

Поэтому мне нужно только обновить браузер, чтобы увидеть изменения. В производстве используйте export var fileVersion = '?tmplv=v1.3.7yourVersionNumber';.

Ответ 7

Лучшим решением является объединение всех необходимых файлов и создание одного .js файла, который может быть легко отменен с помощью простой строки запроса в конце пути (? v = 1.x). Для получения дополнительной информации ознакомьтесь с этим официальным документом: Введение в Webpack: https://angular.io/docs/ts/latest/guide/webpack.html

Ответ 8

Я думаю, что проще всего открыть новый сеанс, используя режим инкогнито, потому что ничего не кэшируется, поэтому он всегда будет перезагружать.