为 Web 站点优雅的生成 Manifest 文件
mainfest.json
manifest.json
文件通常包含有关 Web 应用程序的元数据信息,这些信息会影响到浏览器如何展示和处理这个应用程序。常见的信息包括:
- name:应用程序的名称。
- short_name:应用程序的简短名称,通常用于手机屏幕上的应用程序图标。
- start_url:应用程序启动时加载的 URL。
- display:定义应用程序的显示模式,如 "fullscreen"、"standalone"、"minimal-ui" 等。
- background_color:应用程序启动时的背景颜色。
- theme_color:应用程序的主题颜色,影响浏览器工具栏、状态栏等。
- icons:包含各种尺寸的图标,用于不同的设备和分辨率。
- scope:应用程序的范围,指定了应用程序可以控制的 URL 范围。
- description:应用程序的描述信息。
- categories:应用程序所属的分类,用于 App Stores 等。
- lang:应用程序使用的语言。
- orientation:应用程序的方向,如 "landscape" 或 "portrait"。
- prefer_related_applications:指示是否更喜欢用户使用相关的本机应用程序,而不是 Web 应用程序。
- related_applications:如果应用程序有相关的本机应用程序,则提供相关应用程序的信息。
利用 Webpack 的特性生成文件
Webpack 编译完成阶段,生成一个 manifest.json 文件
js
class MakeManifestPlugin {
constructor(options) {
this.opts = options
}
apply (compiler) {
const _this = this
// webpack4
if (compiler.plugin) {
// 完成输出事件
compiler.plugin('after-emit', function (compilation, done) {
_this.generateVersion()
done()
})
return
}
// webpack5
compiler.hooks.compile.tap('MakeManifestPlugin', (compilation) => {
_this.generateVersion()
})
}
generateVersion () {
fs.writeFile('public/manifest.json', JSON.stringify(this.opts), function (err) {
if (err) {
return err
}
})
}
}
使用插件
js
{
configureWebpack: (config) => {
if (process.env.NODE_ENV === 'production') {
config.plugins.push(
new GenerateVersionPlugin({
version,
isOpenVersion
})
)
}
}
}
使用 manifest.json 做什么
提醒用户刷新浏览器
现在有了版本号信息,就可以主动判断是否需要最新的资源了。当版本号发生变换时,页面提醒用户有新版本发布,请刷新浏览器。
优化缓存文件
通常针对为了获取最新鲜的静态资源,会有如下写法:
js
const now = new Date().getTime()
const url = `https://www.unpkg.com/browse/react@16.7.0/index.js?t=${now}`
不是所有的静态都需要时刻最新,合理运用缓存。当版本发生变化时,再拿最新的资源。
js
const url = `https://www.unpkg.com/browse/react@16.7.0/index.js?v=${version}`