目标
- 需要预渲染的页面实现预渲染
- 页面中静态资源地址使用cdn静态资源地址
主要问题
publicPath在打包使用prerender-spa-plugin预渲染插件时publicPath必须为’’,’/‘或者页面运行时服务端地址(127.0.0.1:port)
尝试解决
prerender-spa-plugin 插件使用时可以使用postProcess函数对预渲染生成的页面进行进一步处理1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20const cdnPath = '//cdn.com'
new PrerenderSpaPlugin({
staticDir: path.join(__dirname, '/dist'),
routes: ['/', '/aboutus'],
postProcess (renderedRoute) {
// 将地址替换
renderedRoute.html = renderedRoute.html.replace(
/(<script[^<>]*src=\")((?!http|https)[^<>\"]*)(\"[^<>]*>[^<>]*<\/script>)/ig,
`$1${cdnPath}$2$3`
).replace(
/(<link[^<>]*href=\")((?!http|https)[^<>\"]*)(\"[^<>]*>)/ig,
`$1${cdnPath}$2$3`
)
return renderedRoute
},
renderer: new Renderer({
injectProperty: '__PRERENDER_INJECTED__',
inject: 'prerender'
})
})
如果是单页面这样就OK了,但我的项目是多页面应用,这几个多页面分别是index.html,admin.html,other.html,只有index.html中的/
about
这两个路由需要预渲染,我如果改了vue.config.js
文件中的publicPath路径的话整个项目在打包时都换变成’/‘路径,所以需要将index.html
页面与其他页面分开打包。1
2
3
4// package.json
"scripts": {
"build-index": "vue-cli-service build --mode index",
}
科普环境变量文件使用方式
1 | 为一个特定模式准备的环境文件 (例如 .env.production) 将会比一般的环境文件 (例如 .env) 拥有更高的优先级。 |
所以上面--mode index
相当于指定模式为index,这里我们还需要一个index模式的环境变量文件.env.index
1
2
3
4
5
6// .env.index文件
// 指定其他模式都会默认是development模式,所以这里需要显式指定为production模式
NODE_ENV = 'production'
// 这里变量是自己定义的(这里用来区别打包时的页面)
VUE_APP_PAGE = 'index'
下面这些代码的作用:
- 将index.html页面和其他页面单独输出打包
- index.html页面打包时资源路径是’/‘,执行预渲染之后再将链接替换成cdn地址
- 其他页面打包时资源路径是’//cdn.com’
副作用:index页面无法使用路由懒加载(静态资源文件的引用路径无法修改)
1 | // package.json |
1 | // vue.config.js |
1 | // vue.config.js |
1 | // vue.config.js |