如何从Quasar生成的PWA manifest中移除start_url参数
我基于Vue.js开发了一个PWA应用,其manifest.json由Quasar框架自动生成。Quasar会读取quasar.conf.js中的配置参数来生成manifest,我的配置如下:
manifest: { name: `App name`, short_name: `app short name`, description: `Application description`, display: 'fullscreen', orientation: 'any', background_color: '#ffffff', theme_color: '#000000', icons: [...] }
但编译后的manifest会自动添加start_url参数:
{ "name": "App name", "short_name": "app short name", "description": "Application description", "display": "fullscreen", "start_url": ".", "orientation": "any", "background_color": "#ffffff", "theme_color": "#000000", "icons": [...], }
我希望彻底移除这个start_url参数,但无论怎么修改配置,它都会被自动添加上默认值"start_url": ".",无法彻底删除。请问如何完全移除该参数?
更新内容
我的quasar.conf.js完整配置如下:
const open = require('open') const ESLintPlugin = require('eslint-webpack-plugin') const { configure } = require('quasar/wrappers') module.exports = configure(function (ctx) { return { pwa: { workboxPluginMode: 'InjectManifest', // 'GenerateSW' or 'InjectManifest', workboxOptions: { exclude: [ /^.*php\/.*$/, ] }, // for the custom service worker ONLY (/src-pwa/custom-service-worker.[js|ts]) // if using workbox in InjectManifest mode chainWebpackCustomSW (chain) { chain.plugin('eslint-webpack-plugin') .use(ESLintPlugin, [{ extensions: ['js'] }]) }, manifest: { name: `App name`, short_name: `app short name`, description: `Application description`, display: 'fullscreen', orientation: 'any', background_color: '#ffffff', theme_color: '#000000', icons: [ { src: 'icons/icon-128x128.png', sizes: '128x128', type: 'image/png' }, { src: 'icons/icon-192x192.png', sizes: '192x192', type: 'image/png' }, { src: 'icons/icon-256x256.png', sizes: '256x256', type: 'image/png' }, { src: 'icons/icon-384x384.png', sizes: '384x384', type: 'image/png' }, { src: 'icons/icon-512x512.png', sizes: '512x512', type: 'image/png' } ] }, extendManifestJson(json) { delete json.start_url; }, }, cordova: { // noIosLegacyBuildFlag: true, // uncomment only if you know what you are doing }, // Full list of options: https://v2.quasar.dev/quasar-cli/developing-capacitor-apps/configuring-capacitor capacitor: { hideSplashscreen: true }, // Full list of options: https://v2.quasar.dev/quasar-cli/developing-electron-apps/configuring-electron electron: { bundler: 'packager', // 'packager' or 'builder', ... } } })
你已经尝试了extendManifestJson钩子,但可能是Quasar内部逻辑在钩子执行后重新注入了start_url。可以尝试以下两种方案:
方案一:清理缓存后重新编译
先尝试删除项目中的node_modules/.cache和dist目录,再重新执行编译命令。Quasar的缓存可能保留了旧的manifest生成逻辑,清理后或许能让extendManifestJson的删除操作生效。
方案二:通过Webpack钩子强制修改manifest
如果清理缓存无效,可以在quasar.conf.js的build配置中添加自定义Webpack插件,在manifest文件即将输出时直接删除start_url字段:
module.exports = configure(function (ctx) { return { // ... 其他原有配置 build: { chainWebpack(chain) { // 添加自定义插件移除start_url chain.plugin('remove-start-url').use(class { apply(compiler) { compiler.hooks.emit.tap('RemoveStartUrl', (compilation) => { const manifestPath = 'manifest.json'; if (compilation.assets[manifestPath]) { // 解析manifest内容并删除start_url let manifestContent = JSON.parse(compilation.assets[manifestPath].source()); delete manifestContent.start_url; // 替换编译资源中的manifest内容 compilation.assets[manifestPath] = { source: () => JSON.stringify(manifestContent, null, 2), size: () => Buffer.byteLength(JSON.stringify(manifestContent, null, 2), 'utf8') }; } }); } }); } }, // ... 原有pwa配置保持不变 } })
这个方案通过Webpack的emit钩子,直接在编译输出阶段修改manifest文件,不受Quasar内部逻辑的影响,能确保最终生成的文件中没有start_url参数。
方案三:临时修改Quasar源码(不推荐)
找到node_modules/@quasar/app-webpack/dist/pwa/目录下处理manifest的文件(如manifest.js),定位到自动添加start_url的代码段,注释或删除相关逻辑。但该方案的缺点是依赖包更新后会失效,仅适合临时应急。
内容的提问来源于stack exchange,提问作者ulrich

