微前端——vue子项目改造(三)

网上的例子大多是react的就不再写react如何改造,下面介绍vue-cli3的改造`

vue.config.js配置

1.因为之后我们需要采用sytemjs去加载模块,所以我们需要修改webpack的配置改成输出为amd规范。
config.output.library = 'single'
config.output.libraryTarget = 'amd'
2.配置一个devServer指定的地址,以及设置headers允许跨域(为了之前在开发环境中调试而配置)
3.修改输出目录、关闭hash命名、关闭map
此操作仅仅是为了自己的开发方以及build迅速罢了,也可不修改

const path = require('path')
const env = process.env.NODE_ENV
module.exports = {
  configureWebpack: config => {
    config.output.library = 'single'
    config.output.libraryTarget = 'amd'
    config.entry = { app: ['./src/main.js'],store:'./src/Store.js' }
    if (env === 'production') {
      // 为生产环境修改配置...
    } else {
      // 为开发环境修改配置...
    }
  },
  // 配置输出目录
  outputDir: path.resolve(__dirname, './single'),
  // 关闭hash
  filenameHashing: false,
  // 关闭map
  productionSourceMap: false,
  // 静态文件路径
  publicPath: '/single',
  devServer: {
    port: '8201',
    headers: {
      "Access-Control-Allow-Origin": "*",
    }
  }
}

main.js改造

import Vue from 'vue'
import App from './App.vue'
import singleSpaVue from 'single-spa-vue'
import store from './store/index'

Vue.config.productionTip = false
// new Vue({
//   render: h => h(App),
// }).$mount('#app')

// 下面是single-spa配置
const vueLifecycles = singleSpaVue({
  Vue,
  appOptions: {
    el: '#vue-app',
    store,
    render: h => h(App)
  }
})

export const bootstrap = [
  vueLifecycles.bootstrap,
];

export function mount(props) {
  // 从redux传入Vuex
  store.commit('setGlobalEventDistributor',props.globalEventDistributor)
  store.commit('setStore',props.store)
  // 动态创建dom
  createDomElement();
  return vueLifecycles.mount(props);
}

export const unmount = [
  vueLifecycles.unmount,
];

function createDomElement() {
  let el = window.document.getElementById('vue-app');
  if (!el) {
    el = window.document.createElement('div');
    el.id = 'vue-app'
    document.body.appendChild(el)
  }
  return el
}

1、引入single-spa-vue模块修改其渲染的方式

const vueLifecycles = singleSpaVue({
  Vue,
  appOptions: {
    el: '#vue-app',
    store,
    render: h => h(App)
  }
}

2、在mount中获取从父级框架中注入的自定义的配置信息加载到自己的状态管理中(vuex)
3、createDomElement这个方法应该清楚,只是为了创建一个dom用户挂载vue
4、子模块独立运行

// new Vue({
//   render: h => h(App),
// }).$mount('#app')

此处注释掉的代码为原vue项目渲染的方式,如果你想子模块独立运行则可仍旧使用原方式进行渲染。利用process.env.NODE_ENV来判断环境来觉得这段代码是否需要执行那更好,这边就不做详细介绍。
5、创建一个通信文件
在vue.config.js中我们可以看到,做了如下修改config.entry = { app: ['./src/main.js'],store:'./src/Store.js' },新增了一个入口。
此文件用于各模块间通信,后续会详细介绍

import { createStore, combineReducers } from 'redux'

const initialState = {
  refresh: 0
}

function render(state = initialState, action) {
  switch (action.type) {
    case 'REFRESH':
      return { ...state,
        refresh: state.refresh + 1
      }
    default:
      return state
  }
}

// 向外输出 Store
export const storeInstance = createStore(combineReducers({ namespace: () => 'vue', render }))
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在开头 先说说为什么要写这篇文章, 最初的原因是组里的小朋友们看了webpack文档后, 表情都是这样的: (摘...
    Lefter阅读 10,689评论 4 31
  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 6,411评论 0 2
  • 响应式布局的理解 响应式开发目的是一套代码可以在多种终端运行,适应不同屏幕的大小,其原理是运用媒体查询,在不同屏幕...
    懒猫_6500阅读 4,183评论 0 0
  • 开发一个项目,采用什么语言都可以,主要能熟练高效的开发都是合理的,这次我们采用vue来开发一个团队项目。在开...
    MsgSS阅读 8,043评论 3 9
  • 人月圆(元曲 中原音韵)/冬雪遐思 作者:心博、图片:网络 三冬飞雪黄昏堕,谁在北山坡,锁眉枯草,凝眸翠柏,回首...
    心博1阅读 3,089评论 0 1