Nuxtjs
本篇以nuxtjs 2
作为案例介绍nuxtjs的接入方式,其它版本nuxtjs接入方式会在后续补充,如果你在使用时出现问题,请在github上提issue告知我们。
作为主应用
1、安装依赖
npm i @micro-zoe/micro-app --save
2、初始化micro-app
因为webComponent只能运行在浏览器环境,所以我们需要在浏览器环境执行micro-app的初始化。
如果没有layouts文件,则创建文件layouts/default.vue
,如果已经有layouts文件,直接复用即可,layouts相关信息参考:layouts
// layouts/default.vue
<template>
<Nuxt />
</template>
<script>
import microApp from '@micro-zoe/micro-app'
export default {
name: 'default',
mounted () {
microApp.start()
}
}
</script>
3、在页面中嵌入子应用
因为micro-app只能运行在浏览器环境,所以在mounted
钩子中通过变量控制子应用显示。
<template>
<div>
<h1>子应用</h1>
<!-- name:应用名称, url:应用地址 -->
<micro-app v-if='show' name='my-app' url='http://localhost:3000/'></micro-app>
</div>
</template>
<script>
export default {
name: 'my-page',
data () {
return {
show: false,
}
},
mounted () {
this.show = true
},
}
</script>
作为子应用
1、在主应用中添加ssr配置
当子应用是ssr应用时,主应用需要在micro-app元素上添加ssr属性,此时micro-app会根据ssr模式加载子应用。
<micro-app name='xx' url='xx' ssr></micro-app>
2、设置跨域支持
通过自定义服务设置跨域访问。
步骤1、在根目录创建server.js
server.js
的内容如下:
// server.js
const express = require('express')
const { Nuxt, Builder } = require('nuxt')
const app = express()
const host = process.env.HOST || '127.0.0.1'
const port = process.env.PORT || 3000
// Import and set Nuxt options
const config = require('./nuxt.config.js')
config.dev = process.env.NODE_ENV !== 'production'
const nuxt = new Nuxt(config)
// Start build process in dev mode
if (config.dev) {
const builder = new Builder(nuxt)
builder.build()
}
// 设置跨域支持
app.all('*', (req, res, next) => {
res.header("Access-Control-Allow-Origin", '*')
next()
})
// Give nuxt middleware to express
app.use(nuxt.render)
// Start express server
app.listen(port, host, () => {
console.log(`Ready on http://localhost:${port}/`)
})
步骤2、修改package.json
中的scripts
,如下:
"scripts": {
"dev": "node server.js",
"build": "nuxt build",
"start": "cross-env NODE_ENV=production node server.js",
}
3、通过env注入运行时变量assetPrefix
assetPrefix
为静态资源路径前缀,开发者需要手动通过assetPrefix
补全图片地址,避免子应用的图片在使用相对地址时加载失败的情况。
// nuxt.config.js
const basePath = '基础路由' // 默认为 '/'
// 静态资源路径前缀
const assetPrefix = process.env.NODE_ENV === 'production' ? `线上域名${basePath}` : `http://localhost:${process.env.PORT || 3000}${basePath}`
module.exports = {
// 将 assetPrefix 写入环境变量,通过 process.env.assetPrefix 访问
env: {
assetPrefix,
},
// 设置基础路由
router: {
base: basePath,
},
}
使用方式如下:
<template>
<div>
<img :src="localImg" />
</div>
</template>
<script>
import Vue from 'vue'
export default Vue.extend({
data () {
return {
// 补全图片地址
localImg: process.env.assetPrefix + '/local-img.png',
}
}
})
</script>
4、监听卸载
子应用被卸载时会接受到一个名为unmount
的事件,在此可以进行卸载相关操作。
// 监听卸载操作
window.addEventListener('unmount', function () {
// 执行卸载相关操作
})
5、切换到iframe沙箱
MicroApp有两种沙箱方案:with沙箱
和iframe沙箱
。
默认开启with沙箱,如果with沙箱无法正常运行,可以尝试切换到iframe沙箱。
常见问题
1、控制台抛出警告[Vue warn]: Unknown custom element: <micro-app>
解决方式: 在nuxt.config.js
中添加配置,设置ignoredElements
忽略micro-app元素。
// nuxt.config.js
module.exports = {
vue: {
config: {
ignoredElements: [
'micro-app',
],
}
},
}
提示
nuxtjs相关问题可以在nuxtjs专属讨论贴下反馈。
2、无法预加载ssr子应用
原因: 因为ssr应用每个路由地址加载的html、js、css等静态资源都不同,所以无法对ssr子应用使用预加载。