ИЗМЕНИТЬ
Гораздо более простое решение, которое с меньшей вероятностью сломается, когда у ionic есть серьезные обновления.
https://gist.github.com/haydenbr/7df417a8678efc404c820c61b6ffdd24
Итак, очистка кеша с помощью ionic. Это хакерское решение, но пока оно работает. Проблема в том, что ионная система сборки иногда слишком сильно абстрагируется. Еще в октябре нас спросили, есть ли способ реализовать очистку кеша. Команда ionic ответила, что они могут подумать об этом в будущем, но с тех пор никаких действий по этому поводу не велось. Вот проблема с github.
Итак, я покажу все изменения в конфигурации webpack и package.json, а затем все объясню.
Раздел конфигурации вашего package.json должен выглядеть следующим образом.
"config": {
"ionic_webpack": "./webpack.config.js",
"ionic_source_map_type": "source-map",
"ionic_uglifyjs": "./www/uglifyjs.config.json"
}
Для вашей конфигурации веб-пакета ваша запись и вывод могут оставаться прежними. Убедитесь, что вам требуются следующие модули, а затем вы захотите добавить следующие плагины:
var path = require('path'),
fs = require('fs'),
ManifestPlugin = require('webpack-manifest-plugin'),
HtmlWebpackPlugin = require('html-webpack-plugin');
...
plugins: [
new HtmlWebpackPlugin({
filename: './../index.html',
inject: 'body',
template: './src/index.html',
title: 'My App',
}),
new ManifestPlugin(),
updateFileName
]
где updateFileName
выглядит следующим образом
function updateFileName() {
this.plugin("done", function() {
var manifest = require(process.env.IONIC_BUILD_DIR + '/manifest.json'),
fileName = process.env.IONIC_OUTPUT_JS_FILE_NAME;
updateUglifyConfig(fileName, manifest);
process.env.IONIC_OUTPUT_JS_FILE_NAME = manifest[fileName];
});
}
function updateUglifyConfig(fileName, manifest) {
var uglifyConfig = {
sourceFile: manifest[fileName],
destFileName: manifest[fileName],
inSourceMap: manifest[fileName + '.map'],
outSourceMap: manifest[fileName + '.map'],
mangle: true,
compress: true,
comments: true
};
// we're writing this to www because it's specific to the current
// build and we don't want to commit it
fs.writeFileSync(
path.join(__dirname, 'www', 'uglifyjs.config.json'),
JSON.stringify(uglifyConfig, null, 4)
);
}
Так что же здесь происходит на самом деле? Прежде всего, в package.json нам нужно сгенерировать новую конфигурацию uglify для процесса сборки ionic. Вы можете изменить имя файла в середине сборки, и пока вы назначаете новое имя process.env.IONIC_OUTPUT_JS_FILE_NAME
, остальная часть сборки будет работать нормально, за исключением того, что шаг uglify будет по-прежнему искать имя по умолчанию, main.js
. Мы увидим, как мы сгенерируем это ниже.
Теперь о трех подключаемых модулях, которые мы добавляем.
Первый творит магию. Это действительно настраивается. Как это настроено, он берет index.html по умолчанию, устанавливает заголовок, вставляет тег <script>
для вывода javascript, а затем записывает его туда, где вы указали в свойстве имени файла. Если вы используете index.html по умолчанию, полученный из ионного стартового приложения, все, что вам нужно сделать, это избавиться от <script src="build/main.js"></script>
, и он автоматически поместит новую ссылку в свое имя файла с хэшем в нем. Документы здесь.
Следующий плагин выводит для нас файл манифеста, чтобы мы могли узнать имя файла с хэшем. По умолчанию он выводит его в www/build/
. Документы здесь.
Следующий плагин назначает новое имя файла для process.env.IONIC_OUTPUT_JS_FILE_NAME и генерирует для нас новую конфигурацию uglify. По сути, мы берем полученный манифест, записываем новую конфигурацию uglify в каталог www, а затем назначаем новое имя файла из того, что мы получили из манифеста.
Вот и все. Если вы не хотите, чтобы кеш очищался для разработчиков, сохраните плагин html, избавьтесь от двух других, а затем измените имя выходного файла обратно на process.env.IONIC_OUTPUT_JS_FILE_NAME
. Если вы сделаете это, вам вообще не нужно будет ссылаться на основной файл js в вашем src/index.html
. Он будет добавлен независимо от того, работаете ли вы с разработчиком или продуктом. Для получения дополнительной информации об использовании различных настроек веб-пакетов для разных сред, проверьте это.
ОБНОВЛЕНИЕ:
Для ионной 3:
- Убедитесь, что у вас есть эти настройки в
compilerOptions
вашего tsconfig
:
"module": "es2015", "target": "es5"
npm i cheerio --save-dev
- в конфигурации вашего веб-пакета добавьте
var cheerio = require('cheerio')
- Избавьтесь от плагина Webpack Manifest.
Измените updateFileName
на следующее:
function updateFileName() {
this.plugin("done", function(stats) {
var buildOutput = stats.toJson()['assetsByChunkName']['main'],
fileName = process.env.IONIC_OUTPUT_JS_FILE_NAME,
manifest = {
[fileName]: buildOutput[0],
[fileName + '.map']: buildOutput[1]
};
updateUglifyConfig(fileName, manifest);
process.env.IONIC_OUTPUT_JS_FILE_NAME = manifest[fileName];
console.log('IONIC_OUTPUT_JS_FILE_NAME', process.env.IONIC_OUTPUT_JS_FILE_NAME);
});
}
Избавьтесь от плагина Html Webpack
Вместо плагина html поместите следующую функцию в массив плагинов в конфигурации вашего веб-пакета:
function updateIndexHTML() {
this.plugin("done", function(stats) {
var buildOutput = stats.toJson()['assetsByChunkName']['main'],
outputFileName = buildOutput[0],
currentIndexHTML = fs.readFileSync(
path.join(__dirname, 'src', 'index.html'),
{ encoding: 'utf8' }
),
$ = cheerio.load(currentIndexHTML);
$('body').append(`<script src="build/${outputFileName}"></script>`);
fs.writeFileSync(
path.join(process.env.IONIC_WWW_DIR, 'index.html'),
$.html()
);
});
}
person
Hayden Braxton
schedule
15.04.2017