Selaa lähdekoodia

feat: qiankun适配

cuiyalong 1 vuosi sitten
vanhempi
commit
1066e659a0

+ 0 - 7
jypoints-pc/.env.alone

@@ -1,7 +0,0 @@
-NODE_ENV=development
-VUE_APP_BASE_API=''
-VUE_APP_BASE_URL='/'
-VUE_APP_MOCK=true
-VUE_APP_ALONE=true
-VUE_APP_BASE_PUBLIC='/'
-VUE_APP_PREFIX_HOST = 'https://web-zyh.jydev.jianyu360.com/'

+ 1 - 1
jypoints-pc/.env.development

@@ -2,5 +2,5 @@ NODE_ENV=development
 VUE_APP_BASE_API=''
 VUE_APP_BASE_URL='/swordfish/integral/index'
 VUE_APP_MOCK=true
-VUE_APP_BASE_PUBLIC='http://localhost:8080/'
+VUE_APP_BASE_PUBLIC='/'
 VUE_APP_PREFIX_HOST = 'https://web2-jytest.jydev.jianyu360.com/'

+ 1 - 1
jypoints-pc/.env.production

@@ -1,5 +1,5 @@
 NODE_ENV=production
 VUE_APP_BASE_API=''
-VUE_APP_BASE_URL='/swordfish/integral/index'
+VUE_APP_BASE_URL='/page_points_pc'
 VUE_APP_BASE_PUBLIC='/page_points_pc/'
 VUE_APP_PREFIX_HOST = '/'

+ 0 - 5
jypoints-pc/.env.test

@@ -1,5 +0,0 @@
-NODE_ENV=production
-VUE_APP_BASE_API=''
-VUE_APP_BASE_URL='/swordfish/integral/index'
-VUE_APP_BASE_PUBLIC='/page_points_pc/'
-VUE_APP_PREFIX_HOST = '/'

+ 6 - 7
jypoints-pc/package.json

@@ -1,23 +1,22 @@
 {
-  "name": "app",
+  "name": "point-pc",
   "version": "0.1.0",
   "private": true,
   "scripts": {
-    "serve": "vue-cli-service serve --port 8080",
-    "serve:alone": "vue-cli-service serve --mode alone",
-    "build:test": "vue-cli-service build --mode test",
+    "serve": "vue-cli-service serve --port 8091",
     "build": "vue-cli-service build"
   },
   "dependencies": {
+    "@jianyu/easy-fix-sub-app": "^0.0.1",
+    "@jianyu/easy-inject-qiankun": "^0.1.10",
     "axios": "^0.21.1",
     "core-js": "^3.4.3",
     "element-ui": "^2.15.14-rc",
     "loadjs": "^4.2.0",
-    "single-spa-vue": "^1.5.4",
-    "systemjs-webpack-interop": "^1.1.2",
     "vue": "^2.6.10",
     "vue-infinite-scroll": "^2.0.2",
-    "vue-router": "^3.1.3"
+    "vue-router": "^3.1.3",
+    "vuex": "^3.6.2"
   },
   "devDependencies": {
     "@vue/cli-plugin-babel": "^4.1.0",

+ 20 - 20
jypoints-pc/public/index.html

@@ -7,28 +7,28 @@
     <link rel="icon" href="<%= BASE_URL %>favicon.ico">
     <title>剑鱼币</title>
     <% if (process.env.NODE_ENV === 'development') { %>
-    <link href="https://jybx2-webtest.jydev.jianyu360.com/css/bootstrap.min.css" rel="stylesheet">
-    <link href="https://jybx2-webtest.jydev.jianyu360.com/css/bootswatch.min.css" rel="stylesheet">
-    <link href="https://jybx2-webtest.jydev.jianyu360.com/css/font.css?v=6302" rel="stylesheet">
-    <link href="https://jybx2-webtest.jydev.jianyu360.com/css/jy.css?v=6302" rel="stylesheet">
-    <link href="https://jybx2-webtest.jydev.jianyu360.com/css/common.css?v=6302" rel="stylesheet">
-    <link href="https://jybx2-webtest.jydev.jianyu360.com/css/animate.css" rel="stylesheet">
-    <link href="https://jybx2-webtest.jydev.jianyu360.com/css/unicorn.main.css" rel="stylesheet" />
-    <link href="https://jybx2-webtest.jydev.jianyu360.com/css/unicorn.grey.css" rel="stylesheet" />
-    <script src="https://jybx2-webtest.jydev.jianyu360.com/js/jquery-3.2.1.min.js?v=6302"></script>
-    <script src="https://jybx2-webtest.jydev.jianyu360.com/js/jquery.cookie.js"></script>
-    <script src="https://jybx2-webtest.jydev.jianyu360.com/js/bootstrap.min.js"></script>
-    <script src="https://jybx2-webtest.jydev.jianyu360.com/js/coupon/coupon.js"></script>
-    <script src="https://cdn.jsdelivr.net/npm/pdfjs-dist@2.1.266/build/pdf.min.js"></script>
-    <script src="https://cdn.jsdelivr.net/npm/pdfjs-dist@2.1.266/web/pdf_viewer.js"></script>
+    <link ignore href="https://jybx2-webtest.jydev.jianyu360.com/css/bootstrap.min.css" rel="stylesheet">
+    <link ignore href="https://jybx2-webtest.jydev.jianyu360.com/css/bootswatch.min.css" rel="stylesheet">
+    <link ignore href="https://jybx2-webtest.jydev.jianyu360.com/css/font.css?v=6302" rel="stylesheet">
+    <link ignore href="https://jybx2-webtest.jydev.jianyu360.com/css/jy.css?v=6302" rel="stylesheet">
+    <link ignore href="https://jybx2-webtest.jydev.jianyu360.com/css/common.css?v=6302" rel="stylesheet">
+    <link ignore href="https://jybx2-webtest.jydev.jianyu360.com/css/animate.css" rel="stylesheet">
+    <link ignore href="https://jybx2-webtest.jydev.jianyu360.com/css/unicorn.main.css" rel="stylesheet" />
+    <link ignore href="https://jybx2-webtest.jydev.jianyu360.com/css/unicorn.grey.css" rel="stylesheet" />
+    <script ignore src="https://jybx2-webtest.jydev.jianyu360.com/js/jquery-3.2.1.min.js?v=6302"></script>
+    <script ignore src="https://jybx2-webtest.jydev.jianyu360.com/js/jquery.cookie.js"></script>
+    <script ignore src="https://jybx2-webtest.jydev.jianyu360.com/js/bootstrap.min.js"></script>
+    <script ignore src="https://jybx2-webtest.jydev.jianyu360.com/js/coupon/coupon.js"></script>
+    <script ignore src="https://cdn.jsdelivr.net/npm/pdfjs-dist@2.1.266/build/pdf.min.js"></script>
+    <script ignore src="https://cdn.jsdelivr.net/npm/pdfjs-dist@2.1.266/web/pdf_viewer.js"></script>
 
-    <link href='https://jybx2-webtest.jydev.jianyu360.com/css/reset.css?v=6302' rel="stylesheet" type="text/css"/>
-    <link href='https://jybx2-webtest.jydev.jianyu360.com/pccss/reset_pc.css' rel="stylesheet" type="text/css"/>
-    <link href='https://jybx2-webtest.jydev.jianyu360.com/css/pc.css?v=6302' rel="stylesheet"/>
-    <link href='https://jybx2-webtest.jydev.jianyu360.com/pccss/public-nav-1200.css?v=6302' rel="stylesheet" type="text/css"/>
-    <link href='https://jybx2-webtest.jydev.jianyu360.com/css/coupon/coupon.css' rel="stylesheet" type="text/css"/>
+    <link ignore href='https://jybx2-webtest.jydev.jianyu360.com/css/reset.css?v=6302' rel="stylesheet" type="text/css"/>
+    <link ignore href='https://jybx2-webtest.jydev.jianyu360.com/pccss/reset_pc.css' rel="stylesheet" type="text/css"/>
+    <link ignore href='https://jybx2-webtest.jydev.jianyu360.com/css/pc.css?v=6302' rel="stylesheet"/>
+    <link ignore href='https://jybx2-webtest.jydev.jianyu360.com/pccss/public-nav-1200.css?v=6302' rel="stylesheet" type="text/css"/>
+    <link ignore href='https://jybx2-webtest.jydev.jianyu360.com/css/coupon/coupon.css' rel="stylesheet" type="text/css"/>
 
-    <script src="http://localhost/js/coupon/coupon.js"></script>
+    <script ignore src="http://localhost/js/coupon/coupon.js"></script>
     <% } %>
   </head>
   <body>

+ 86 - 36
jypoints-pc/src/components/BuySubmitSticky.vue

@@ -1,6 +1,9 @@
 <template>
   <div class="buy-submit-sticky sticky-footer">
-    <div class="flex-r-c v-w1200">
+    <div class="sticky-footer-tip-container">
+      <slot name="sticky-footer-tip"></slot>
+    </div>
+    <div class="sticky-content flex-r-c v-w1200">
       <div class="price-agreement">
         <el-checkbox :value="agreement" @change="agreeCheckboxChange">
           <span>已阅读并同意</span>
@@ -28,23 +31,28 @@
         </slot>
       </div>
       <div class="price-submit-container">
-        <button class="price-submit" :disabled="confirmButtonDisabled" @click="buySubmit">
-          <div class="confirm-button-text">确定支付</div>
-          <div class="confirm-button-tip-text" v-if="submitTipText">{{submitTipText}}</div>
-        </button>
+        <el-button plain class="submit-button preview-button" @click="onCancel" v-show="plainButtonText">{{ plainButtonText }}</el-button>
+        <el-button type="primary" class="submit-button price-submit" :disabled="confirmButtonDisabled" :loading="loading" @click="buySubmit">
+          <div class="button-content">
+            <div class="confirm-button-text">{{submitText}}</div>
+            <div class="confirm-button-tip-text" v-if="submitTipText">{{submitTipText}}</div>
+          </div>
+        </el-button>
       </div>
     </div>
   </div>
 </template>
 
 <script>
-import { Checkbox, Link } from 'element-ui'
+import { Checkbox, Link, Button } from 'element-ui'
+import { debounce, throttle } from 'lodash'
 
 export default {
   name: 'buy-submit-sticky',
   components: {
     [Checkbox.name]: Checkbox,
-    [Link.name]: Link
+    [Link.name]: Link,
+    [Button.name]: Button
   },
   model: {
     prop: 'agreement',
@@ -59,6 +67,22 @@ export default {
       type: Boolean,
       default: false
     },
+    plainButtonText: {
+      type: String,
+      default: ''
+    },
+    submitText: {
+      type: String,
+      default: '确定支付'
+    },
+    submitTipText: {
+      type: String,
+      default: ''
+    },
+    loading: {
+      type: Boolean,
+      default: false
+    },
     containerSelector: {
       type: String,
       default: '#recharge'
@@ -81,10 +105,6 @@ export default {
       type: Boolean,
       default: true
     },
-    submitTipText: {
-      type: String,
-      default: ''
-    },
     linkUnderline: {
       type: Boolean,
       default: false
@@ -92,25 +112,37 @@ export default {
   },
   mounted () {
     this.windowScrollFn()
+    this.calcStickyFooterMaxWitch()
     this.$on('hook:mounted', () => {
       // dom插入到根元素
       this.appendDomToContainer(this.$el, this.containerSelector)
-      $(window).on('scroll', this.windowScrollFn)
-      $('body').on('scroll', this.windowScrollFn)
-      $(window).on('resize', this.windowScrollFn)
+      window.addEventListener('scroll', this.windowScrollFn)
+      window.addEventListener('resize', this.windowScrollFn)
+      window.addEventListener('resize', this.calcStickyFooterMaxWitch)
     })
     this.$on('hook:destroyed', () => {
       this.removeDomFromContainer(this.$el, this.containerSelector)
-      $(window).off('scroll', this.windowScrollFn)
-      $('body').off('scroll', this.windowScrollFn)
-      $(window).off('resize', this.windowScrollFn)
+      window.removeEventListener('scroll', this.windowScrollFn)
+      window.removeEventListener('resize', this.windowScrollFn)
+      window.removeEventListener('resize', this.calcStickyFooterMaxWitch)
     })
   },
   methods: {
+    calcStickyFooterMaxWitch: debounce(function () {
+      const $el = this.$el
+      const $parent = this.$el.parentNode
+      if ($parent) {
+        let maxWidth = $parent.clientWidth
+        if (maxWidth) {
+          maxWidth = maxWidth <= 1200 ? 1200 : maxWidth
+          $el.style.maxWidth = `${maxWidth}px`
+        }
+      }
+    }, 50),
     appendDomToContainer (el, selector) {
       var container
       if (selector) {
-        container = document.querySelector(selector)
+        container = this.$root.$el.querySelector(selector) || this.$root.$el
       }
       if (!container) {
         container = document.body
@@ -120,7 +152,7 @@ export default {
     removeDomFromContainer (el, selector) {
       var container
       if (selector) {
-        container = document.querySelector(selector)
+        container = this.$root.$el.querySelector(selector)
       }
       if (!container) {
         container = document.body
@@ -164,25 +196,25 @@ export default {
       const inViewport = offsetTop <= window.innerHeight && offsetBottom >= x
       return inViewport
     },
-    windowScrollFn () {
+    windowScrollFn: throttle(function () {
       // 购买底部固定
       // 判断xx是否处于可视区域
+      const $ = this.$querySelector.bind(this)
       const mainFooter = $(this.basicSelector)
       const stickyFooter = $(this.$el)
 
       if (!mainFooter.length) return
 
       const show = !this.isInViewport(mainFooter[0])
-
       if (show) {
         stickyFooter.show()
 
         // 吸底
         // 如果距离底部
-        const bottomFooter = $('.j-bottom')
+        const bottomFooter = document.querySelector('.j-bottom')
         let ob = { top: 0 }
-        if (bottomFooter.length) {
-          ob = bottomFooter[0] && bottomFooter[0].getBoundingClientRect()
+        if (bottomFooter) {
+          ob = bottomFooter.getBoundingClientRect()
         }
         // bottom出现在视口
         const bottom = window.innerHeight - ob.top
@@ -194,10 +226,13 @@ export default {
       } else {
         stickyFooter.hide()
       }
-    },
+    }, 300),
     agreeCheckboxChange (f) {
       this.$emit('change', f)
     },
+    onCancel () {
+      this.$emit('cancel')
+    },
     buySubmit () {
       this.$emit('submit')
     }
@@ -208,13 +243,6 @@ export default {
 <style lang="scss" scoped>
 $color_main: #2CB7CA;
 
-.confirm-button-tip-text {
-  margin-top: 2px;
-  font-size: 12px;
-  line-height: 18px;
-  color: rgba(255, 255, 255, 0.65);
-}
-
 .sticky-footer {
   position: fixed;
   bottom: 0;
@@ -222,9 +250,21 @@ $color_main: #2CB7CA;
   width: 100%;
   background-color: #fff;
   box-shadow: 0px -4px 8px 1px rgba(0, 0, 0, 0.05);
+  transition: max-width,width 0.5s ease;
+}
+.confirm-button-tip-text {
+  margin-top: 2px;
+  font-size: 12px;
+  line-height: 18px;
+  color: rgba(255, 255, 255, 0.65);
 }
 .buy-submit-sticky {
-  padding: 12px 0;
+  > .v-w1200 {
+    max-width: 1200px;
+  }
+  .sticky-content {
+    padding: 12px 0;
+  }
   .price-preview {
     flex: 1;
     justify-content: flex-end;
@@ -281,13 +321,16 @@ $color_main: #2CB7CA;
     display: flex;
     align-items: center;
     justify-content: flex-end;
-    .price-submit {
+    .submit-button {
       display: flex;
       align-items: center;
       justify-content: center;
-      flex-direction: column;
-      width: 180px;
+      padding-top: 0;
+      padding-bottom: 0;
       height: 46px;
+    }
+    .price-submit {
+      width: 180px;
       line-height: 1;
       text-align: center;
       font-size: 16px;
@@ -299,6 +342,13 @@ $color_main: #2CB7CA;
         opacity: 0.5;
       }
     }
+    .button-content {
+      margin-left: 8px;
+      display: flex;
+      align-items: center;
+      justify-content: center;
+      flex-direction: column;
+    }
   }
 }
 

+ 1 - 0
jypoints-pc/src/components/uploadDoc.vue

@@ -82,6 +82,7 @@ export default {
       this.$emit('fatherRecharge')
     },
     loadCommonJS () {
+      const $ = this.$querySelector.bind(this)
       const version = localStorage.getItem('jyVersion-to-vue') || ''
       window.onUpDocSuccessCallback = () => {
         this.$emit('update')

+ 14 - 24
jypoints-pc/src/main.js

@@ -1,7 +1,10 @@
+import '@jianyu/easy-inject-qiankun/src/pre-mount'
 import Vue from 'vue';
 import App from './App.vue';
 import router from './router';
-import singleSpaVue from 'single-spa-vue';
+import { easySubAppRegister } from '@jianyu/easy-inject-qiankun'
+import { fixGetComputedStyle } from '@jianyu/easy-fix-sub-app/lib/getComputedStyle'
+import './utils/jq-help'
 import infiniteScroll from "vue-infinite-scroll";
 
 // 正式环境下屏蔽console.log
@@ -18,27 +21,14 @@ Vue.use(infiniteScroll);
 
 Vue.config.productionTip = false;
 
-const vueOptions = {
-  el: '#single-spa-app',
+export const { bootstrap, mount, unmount } = easySubAppRegister({
+  Vue,
   router,
-  render: (h) => h(App),
-}
-
-
-let vueLifecycles = {}
-if (process.env.VUE_APP_ALONE) {
-  delete vueOptions.el
-  new Vue(vueOptions).$mount('#app')
-} else {
-  vueLifecycles = singleSpaVue({
-    Vue,
-    appOptions: vueOptions,
-  });
-}
-
-export const bootstrap = vueLifecycles.bootstrap;
-export const mount = vueLifecycles.mount;
-export const unmount = vueLifecycles.unmount;
-
-export default vueLifecycles
-
+  store,
+  App,
+  el: '#app'
+}, {
+  bootstrap () {
+    fixGetComputedStyle()
+  }
+})

+ 1 - 1
jypoints-pc/src/router.js

@@ -6,7 +6,7 @@ Vue.use(Router)
 
 export default new Router({
   mode: 'history',
-  base:  process.env.VUE_APP_BASE_URL,
+  base: window.__POWERED_BY_QIANKUN__ ? window.__QIANKUN_ROUTER_BASE : process.env.VUE_APP_BASE_URL,
   routes: [
     {
       path: '/',

+ 0 - 6
jypoints-pc/src/set-public-path.js

@@ -1,6 +0,0 @@
-import { setPublicPath } from 'systemjs-webpack-interop'
-
-if (!process.env.VUE_APP_ALONE) {
-  setPublicPath('points', 2)
-}
-

+ 22 - 0
jypoints-pc/src/utils/jq-help.js

@@ -0,0 +1,22 @@
+import Vue from 'vue'
+
+export function getEventTarget (e) {
+  if (e.composedPath) {
+    const path = e.composedPath()
+    return path.length ? path[0] : e.target
+  } else if (e.path) {
+    return e.path[0]
+  } else {
+    return e.target
+  }
+}
+
+export function querySelector (selector, native = false) {
+  if (native) {
+    return this.$root.$el.querySelector(selector)
+  } else {
+    return $(this.$root.$el).find(selector)
+  }
+}
+
+Vue.prototype.$querySelector = querySelector

+ 2 - 2
jypoints-pc/src/views/Recharge.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="recharge" id="recharge">
-      <div class="w-1200">
+      <div class="v-w1200">
         <div class="recharge-title">充值剑鱼币</div>
         <div class="recharge-box">
           <div class="clearfix pay">
@@ -193,6 +193,7 @@ export default {
       this.refreshCoupon()
     },
     refreshCoupon () {
+      const $ = this.$querySelector.bind(this)
       this.$nextTick(() => {
         let originPay = $('.original_price .text--money').text()
         let shouldPay = $('.should_pay .text--money').text()
@@ -547,7 +548,6 @@ $main: #2CB7CA;
       .pay-btn{
         width: 180px;
         height: 46px;
-        line-height: 46px;
         background: #2CB7CA;
         color: #fff;
         font-size: 16px;

+ 17 - 6
jypoints-pc/vue.config.js

@@ -1,3 +1,6 @@
+const packageName = require('./package.json').name
+const webpack = require('webpack')
+
 module.exports = {
   parallel: false,
   productionSourceMap: false,
@@ -36,7 +39,7 @@ module.exports = {
   css: {
     loaderOptions: {
       sass: {
-        prependData: '@import "@/assets/style/_mixin.scss";@import "@/assets/style/_variables.scss";@import "@/assets/style/base.scss";'
+        prependData: '@import "@/assets/style/_mixin.scss";@import "@/assets/style/_variables.scss";'
       }
     }
   },
@@ -44,11 +47,19 @@ module.exports = {
     if (!process.env.VUE_APP_ALONE) {
       config.devServer.set('inline', false)
       config.devServer.set('hot', true)
-      if (process.env.NODE_ENV !== 'production') {
-        config.output.filename(`js/[name].js`)
-      }
-      config.externals(['vue', 'vue-router'])
     }
   },
-  filenameHashing: false
+  configureWebpack: {
+    output: {
+      library: 'pointSubApp',
+      libraryTarget: 'umd',
+      jsonpFunction: `webpackJsonp_${packageName}`
+    },
+    plugins: [
+      // new webpack.ProvidePlugin({
+      //   jQuery: 'jquery',
+      //   $: 'jquery'
+      // })
+    ]
+  }
 }

+ 15 - 10
jypoints-pc/yarn.lock

@@ -917,6 +917,16 @@
     cssnano-preset-default "^4.0.0"
     postcss "^7.0.0"
 
+"@jianyu/easy-fix-sub-app@^0.0.1":
+  version "0.0.1"
+  resolved "http://192.168.3.71:4873/@jianyu/easy-fix-sub-app/-/easy-fix-sub-app-0.0.1.tgz#e67307eff24e1a8243b0ddde7069143573bab532"
+  integrity sha512-fLLdXxWjocygUEtV0wIMY1Sj1RdTVN5SmsipEcIeB0B/k1lM0jqBjN7d9BRL0KF7C4G+Q+KaXvYT8A1ZTDu5SQ==
+
+"@jianyu/easy-inject-qiankun@^0.1.10":
+  version "0.1.11"
+  resolved "http://192.168.3.71:4873/@jianyu/easy-inject-qiankun/-/easy-inject-qiankun-0.1.11.tgz#d93e61a119ecc771496c635ec544db718a852440"
+  integrity sha512-fWUV7pw0B3yvARmKUrxpTFlN8VlDd2SydozXANEdeK5lqmiNNCvkzK3X8KEx1Zj2bxtcQ9gEmEvf/JH+TgAq4Q==
+
 "@mrmlnc/readdir-enhanced@^2.2.1":
   version "2.2.1"
   resolved "https://registry.npm.taobao.org/@mrmlnc/readdir-enhanced/download/@mrmlnc/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
@@ -6895,11 +6905,6 @@ simple-swizzle@^0.2.2:
   dependencies:
     is-arrayish "^0.3.1"
 
-single-spa-vue@^1.5.4:
-  version "1.10.1"
-  resolved "https://registry.npm.taobao.org/single-spa-vue/download/single-spa-vue-1.10.1.tgz#80cbb603dc8eaec4148577b3570fa04b2d45ee16"
-  integrity "sha1-gMu2A9yOrsQUhXezVw+gSy1F7hY= sha512-a9HDjscAIjtbIpIFVgV8FcUlhLmofrKcczbus6lFD74kgD2yIfGGU/A8kUfwPXiZUDDpzL7QC3IGLUu31VgQ8g=="
-
 slash@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npm.taobao.org/slash/download/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
@@ -7316,11 +7321,6 @@ svgo@^1.0.0:
     unquote "~1.1.1"
     util.promisify "~1.0.0"
 
-systemjs-webpack-interop@^1.1.2:
-  version "1.2.1"
-  resolved "https://registry.npm.taobao.org/systemjs-webpack-interop/download/systemjs-webpack-interop-1.2.1.tgz#70cce64a93ff646f52344eb560288d83362c9695"
-  integrity "sha1-cMzmSpP/ZG9SNE61YCiNgzYslpU= sha512-tNj9dACkQlNSAC+7d0MKwebXNt7M/3WDiQ0uj/1stBK061eSyaAlMcgp9t3EkYYrDp1ivxzAM4YhDCqPoai8Gg=="
-
 tapable@^1.0.0, tapable@^1.1.3:
   version "1.1.3"
   resolved "https://registry.npm.taobao.org/tapable/download/tapable-1.1.3.tgz?cache=0&sync_timestamp=1607088891056&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftapable%2Fdownload%2Ftapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
@@ -7831,6 +7831,11 @@ vue@^2.6.10:
   resolved "https://registry.npm.taobao.org/vue/download/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123"
   integrity "sha1-9evU+mvShpQD4pqJau1JBEVskSM= sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
 
+vuex@^3.6.2:
+  version "3.6.2"
+  resolved "https://registry.npmmirror.com/vuex/-/vuex-3.6.2.tgz#236bc086a870c3ae79946f107f16de59d5895e71"
+  integrity sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==
+
 watchpack-chokidar2@^2.0.1:
   version "2.0.1"
   resolved "https://registry.npm.taobao.org/watchpack-chokidar2/download/watchpack-chokidar2-2.0.1.tgz?cache=0&sync_timestamp=1604989063099&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fwatchpack-chokidar2%2Fdownload%2Fwatchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957"