精华内容
下载资源
问答
  • vue项目打包流程

    千次阅读 2021-01-09 16:56:45
    vue项目打包流程 二、打包优化 1.首先在根目录下面创建一个vue.config.js文件 2.去除.map文件,在vue.config.js文件里面抛出一个对象,然后把下面两段代码写到对象里面,然后在控制台或者终端通过npm run build命令...

    vue项目打包流程

    二、打包优化

    1.首先在根目录下面创建一个vue.config.js文件
    在这里插入图片描述
    2.去除.map文件,在vue.config.js文件里面抛出一个对象,然后把下面两段代码写到对象里面,然后在控制台或者终端通过npm run build命令,打包项目

    注:如果一次不行,就在执行一次

    module.exports = {}//在vue.config.js文件里面抛出一个对象
    
    publicPath: "./",
    productionSourceMap: false, //不输出map文件
    

    在这里插入图片描述
    3.开启CDN加速,把下面这段代码写到vue.config.js这个文件里面,切记要写到module.exports = {}这个对象上面

    / 是否为生产环境
    const isProduction = process.env.NODE_ENV !== 'development';
    
    // 本地环境是否需要使用cdn
    const devNeedCdn = false
    
    // cdn链接
    const cdn = {
        // cdn:模块名称和模块作用域命名(对应window里面挂载的变量名称)
        externals: {
            vue: 'Vue',
            vuex: 'Vuex',
            'vue-router': 'VueRouter',
            'marked': 'marked',
            'highlight.js': 'hljs',
            'nprogress': 'NProgress',
            'axios': 'axios'
        },
        // cdn的css链接
        css: [
            
        ],
        // cdn的js链接
        js: [
            'https://cdn.bootcss.com/vue/2.6.10/vue.min.js',
            'https://cdn.bootcss.com/vuex/3.1.2/vuex.min.js',
            'https://cdn.bootcss.com/vue-router/3.1.3/vue-router.min.js',
            'https://cdn.bootcss.com/axios/0.19.2/axios.min.js'
        ]
    }
    

    在这里插入图片描述

    在这里插入图片描述
    3.1:在抛出的那个对象module.exports = {}里面写入下面这段代码

    chainWebpack: config => {
        // ============注入cdn start============
        config.plugin('html').tap(args => {
            // 生产环境或本地需要cdn时,才注入cdn
            if (isProduction || devNeedCdn) args[0].cdn = cdn
            return args
        })
        // ============注入cdn start============
    },
    

    在这里插入图片描述
    3.2:在public这个文件夹下面,找到index.html这个文件,在title这个标签下面,head头标签里面把下面这段代码复制进去

     <!-- 使用CDNCSS文件 -->
        <% for (var i in htmlWebpackPlugin.options.cdn &&
        htmlWebpackPlugin.options.cdn.css) { %>
        <link href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="stylesheet" />
        <% } %>
        <!-- 使用CDNCSS文件 -->
    
        <!-- 使用CDNJS文件 -->
        <% for (var i in htmlWebpackPlugin.options.cdn &&
        htmlWebpackPlugin.options.cdn.js) { %>
        <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
        <% } %>
        <!-- 使用CDNJS文件 -->
    

    在这里插入图片描述
    3.3:上面这些操作步骤就是开始CDN加速的流程,把上面这些步骤操作完以后,我们继续在控制台输入npm run build这个命令,继续打包,打包完成以后在你的文件夹里面应该会有一个dist这个文件,这个文件就是打包后的文件,你可以鼠标右键,点击属性,就可以看到他的体积已经变小啦
    在这里插入图片描述
    在这里插入图片描述
    4.我们继续执行下面的步骤

    代码压缩:

    4.1:首先我们先在控制台安装命令:npm i -D uglifyjs-webpack-plugin

    4.2.然后把下面这段代码写到vue.config.js这个文件里面,这段代码也是要写到抛出的那个对象外面,不能写到抛出的对象里面

    const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
    
    

    4.3:接着我们把下面的代码写到configureWebpack这个对象里面,写完以后继续执行npm run build命令,继续打包,打包完成以后再dist这个文件夹里面有个index.html,然后双击打开它,看项目是否能跑起来

     // 代码压缩
      config.plugins.push(
      new UglifyJsPlugin({
          uglifyOptions: {
              //生产环境自动删除console
              compress: {
                  drop_debugger: true,
                  drop_console: true,
                  pure_funcs: ['console.log']
              }
          },
          sourceMap: false,
          parallel: true
      })
    )
    

    在这里插入图片描述
    5.接着操作公共代码抽离,还是在configureWebpack这个对象里面继续往下写

    // 公共代码抽离
    config.optimization = {
      splitChunks: {
          cacheGroups: {
              vendor: {
                  chunks: 'all',
                  test: /node_modules/,
                  name: 'vendor',
                  minChunks: 1,
                  maxInitialRequests: 5,
                  minSize: 0,
                  priority: 100
              },
              common: {
                  chunks: 'all',
                  test: /[\\/]src[\\/]js[\\/]/,
                  name: 'common',
                  minChunks: 2,
                  maxInitialRequests: 5,
                  minSize: 0,
                  priority: 60
              },
              styles: {
                  name: 'styles',
                  test: /\.(sa|sc|c)ss$/,
                  chunks: 'all',
                  enforce: true
              },
              runtimeChunk: {
                  name: 'manifest'
              }
          }
      }
    }
    

    6.骨架屏

    • 先安装npm install vue-skeleton-webpack-plugin这个命令
    • 然后在src这个文件夹下面创建一个Skeleton文件夹,这个名字可以自定义,在这个文件夹下面创建两个文件,index.jsindex.vue这个两个文件

    index.js里面写入下面代码

    import Vue from 'vue'
    import Skeleton from './index.vue'
    export default new Vue({
      components: {
        Skeleton
      },
      template: '<Skeleton />'
    })
    

    index.vue里面写入:

    <template>
      <div class="skeleton-wrapper">
        <header class="skeleton-header"></header>
        <section class="skeleton-block">
          <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMTA4MCAyNjEiPjxkZWZzPjxwYXRoIGlkPSJiIiBkPSJNMCAwaDEwODB2MjYwSDB6Ii8+PGZpbHRlciBpZD0iYSIgd2lkdGg9IjIwMCUiIGhlaWdodD0iMjAwJSIgeD0iLTUwJSIgeT0iLTUwJSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94Ij48ZmVPZmZzZXQgZHk9Ii0xIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIi8+PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd09mZnNldE91dGVyMSIgdmFsdWVzPSIwIDAgMCAwIDAuOTMzMzMzMzMzIDAgMCAwIDAgMC45MzMzMzMzMzMgMCAwIDAgMCAwLjkzMzMzMzMzMyAwIDAgMCAxIDAiLz48L2ZpbHRlcj48L2RlZnM+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDEpIj48dXNlIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNhKSIgeGxpbms6aHJlZj0iI2IiLz48dXNlIGZpbGw9IiNGRkYiIHhsaW5rOmhyZWY9IiNiIi8+PHBhdGggZmlsbD0iI0Y2RjZGNiIgZD0iTTIzMCA0NGg1MzN2NDZIMjMweiIvPjxyZWN0IHdpZHRoPSIxNzIiIGhlaWdodD0iMTcyIiB4PSIzMCIgeT0iNDQiIGZpbGw9IiNGNkY2RjYiIHJ4PSI0Ii8+PHBhdGggZmlsbD0iI0Y2RjZGNiIgZD0iTTIzMCAxMThoMzY5djMwSDIzMHpNMjMwIDE4MmgzMjN2MzBIMjMwek04MTIgMTE1aDIzOHYzOUg4MTJ6TTgwOCAxODRoMjQydjMwSDgwOHpNOTE3IDQ4aDEzM3YzN0g5MTd6Ii8+PC9nPjwvc3ZnPg==">
          <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgMTA4MCAyNjEiPjxkZWZzPjxwYXRoIGlkPSJiIiBkPSJNMCAwaDEwODB2MjYwSDB6Ii8+PGZpbHRlciBpZD0iYSIgd2lkdGg9IjIwMCUiIGhlaWdodD0iMjAwJSIgeD0iLTUwJSIgeT0iLTUwJSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94Ij48ZmVPZmZzZXQgZHk9Ii0xIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIi8+PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd09mZnNldE91dGVyMSIgdmFsdWVzPSIwIDAgMCAwIDAuOTMzMzMzMzMzIDAgMCAwIDAgMC45MzMzMzMzMzMgMCAwIDAgMCAwLjkzMzMzMzMzMyAwIDAgMCAxIDAiLz48L2ZpbHRlcj48L2RlZnM+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwIDEpIj48dXNlIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNhKSIgeGxpbms6aHJlZj0iI2IiLz48dXNlIGZpbGw9IiNGRkYiIHhsaW5rOmhyZWY9IiNiIi8+PHBhdGggZmlsbD0iI0Y2RjZGNiIgZD0iTTIzMCA0NGg1MzN2NDZIMjMweiIvPjxyZWN0IHdpZHRoPSIxNzIiIGhlaWdodD0iMTcyIiB4PSIzMCIgeT0iNDQiIGZpbGw9IiNGNkY2RjYiIHJ4PSI0Ii8+PHBhdGggZmlsbD0iI0Y2RjZGNiIgZD0iTTIzMCAxMThoMzY5djMwSDIzMHpNMjMwIDE4MmgzMjN2MzBIMjMwek04MTIgMTE1aDIzOHYzOUg4MTJ6TTgwOCAxODRoMjQydjMwSDgwOHpNOTE3IDQ4aDEzM3YzN0g5MTd6Ii8+PC9nPjwvc3ZnPg==">
        </section>
      </div>
    </template>
     
    <script>
      export default {
        name: 'skeleton'
      }
    </script>
     
    <style scoped>
      .skeleton-header {
        height: 40px;
        background: #1976d2;
        padding:0;
        margin: 0;
        width: 100%;
      }
      .skeleton-block {
        display: flex;
        flex-direction: column;
        padding-top: 8px;
      }
     
    </style>
    
    

    7.下面在vue.config.js写入
    注:这段代码写到configureWebpack这个对象里面

    config.plugins.push(new SkeletonWebpackPlugin({
      webpackConfig: {
        entry: {
          app: path.join(__dirname, './src/skeleton/indx.js'),
        },
      },
      minimize: true,
      quiet: true,
      // 如果不设置那么所有的路由都会共享这个骨架屏组件
      router: {
        mode: 'hash',
        // 给对应的路由设置对应的骨架屏组件,skeletonId的值根据组件设置的id
        routes: [
          { path: '/home', skeletonId: 'skeleton' }
        ]
      }}))
    

    下面这段代码写到对象外面,不能学到任何的一个对象里面

    //骨架屏渲染
    const SkeletonWebpackPlugin = require('vue-skeleton-webpack-plugin')
    
    //path引入
    const path = require('path')
    

    在这里插入图片描述

    展开全文
  • 1.Webpack的基础安装:npm i webpack webpack-cli vue vue-cli webpack-dev-server --save-dev 2.常用的loader:[babel-loader, @babel/core, @babel/preset-env, @babel/polyfill, style-loader, css-loader, less-...

    安装

    1.Webpack的基础安装:npm i webpack webpack-cli vue vue-cli webpack-dev-server --save-dev
    2.常用的loader:[babel-loader, @babel/core, @babel/preset-env, @babel/polyfill, style-loader, css-loader, less-loader, vue-loader, vue-template-compiler, eslint-loader]
    3.常用的plugin:[html-webpack-plugin, clean-webpack-plugin, copy-webpack-plugin]

    配置

    1. 在webpack.common.js文件中按照需求写入模式 、入口、输出、依赖和插件。
    2. 将js文件、vue文件、less和图片文件等等模块,分别使用不同的loader进行处理。
    3. 然后写上webpack-dev-server配置,先定义一下端口号。在配置以npx 启动webpack打包和webpack-dev-server。
    4. 按报错的提示分别加上对应的plugin处理,这里要注意index.html有BASE_URL,需要通过DefinePlugin来注入 JSON.stringify(’./public/’)路径
      如果两个命令都没有问题,就可以通过merge来进行分模块编写配置文件了,分别对应webpack.dev.js和webpack.prod.js。
    5. 把命令写进npmscript中,开启source-map,在不同配置文件里选择不同模式
      用webpack-dev-server的属性hotOnly开启HMR同时避免错误后刷新
    6. 开启dev环境的tree-shaking
    7. 将eslint命令写进npmScript里
      大功告成,恭喜你,到这里你的项目就成功了!
    展开全文
  • Vue项目打包步骤Vue项目打包流程介绍生成打包报告修改默认配置指定打包入口通过external加载外部CDN资源优化组件库的打包首页内容定制路由懒加载 Vue项目打包流程介绍 新手必须要懂的 Vue项目打包 , 生成打包报告 ...

    Vue项目打包流程介绍

    新手必须要懂的 Vue项目打包

    生成打包报告

    为能更加清楚直观的发现我们项目中存在的问题,我们可以在打包时生成一份打包报告,打包报告生成的方式有两种:

    1. 通过命令生成
      通过vue-cli的命令可以生成打包报告 report.html
     vue-cli-service build --report 
    
    1. 通过可视化控制面板直接查看
      推荐使用这种方式。在vue-cli3以上版本,通过vue ui进入的可视化控制面板中可以清楚的看到项目存在的问题与详细情况。控制台和分析面板可以看到项目中存在的问题,仪表盘可以看到每个包占的内存。在这里插入图片描述

    修改默认配置

    vue-cli3隐藏了所有的webpack配置项,我们需要在vue.config.js中队我们项目打包发布作自定义配置,常用如下:

    module.exports = {
      publicPath: "/", // 部署应⽤包时的基本 URL
      outputDir: "dist", // npm run build ⽣成的⽂件夹,默认是dist
      assetsDir: "static", // 在kaixin⽂件夹下⾯⽣成static⽬录存放js,img,css等静态资源
      indexPath: "index.html", // ⽣成的单⽂件的,⽂件名,
      devServer: {
        host: "127.0.0.1", // 配置主机地址
        port: process.env.NODE_ENV == 'production' ? 3000 : 8888, // 配置运⾏的端⼝
        
        // proxy: "接⼝地址",  跨域代理! 【重要!】
        proxy: { // 配置多个!
          '/api': {
            target: 'http://localhost:3030/api',
            ws: true, // 跨域地址是https协议!
            changeOrigin: true,
            pathWrite: {
              "^/api": ""   // 将 '/api' 替换成 ''  
            }
          }
        },
      }
    }
    

    具体参考文档https://cli.vuejs.org/zh/config/#vue-config-js

    指定打包入口

    默认情况下Vue的开发模式和生产模式公用一个打包入口文件(main.js)。为了分离两者,我们指定两种模式的打包入口文件:

    1. 开发模式:src/main-dev.js
    2. 生产模式:src/main-prod.js
      在这里插入图片描述

    通过external加载外部CDN资源

    默认情况下,通过import引入的三方依赖包最终会一并打包到文件中,由此我们打包后项目体积会过大。
    中上所述,我们可以通过webpack的externals节点来配置并加载外部的CDN资源。凡是在externals中声明的三方依赖包都不会被打包。
    如下图:在这里插入图片描述
    同时我们需要在public/index.html文件头部添加如下的CDN资源引用:在这里插入图片描述
    据上述操作后,我们的文件体积减少了非常多。

    优化组件库的打包

    开发模式中,虽然已经对组件库使用了按需加载的模式,但是打包后还是产生了体积较大的文件,因此同上操作,我们也可以采用CDN加载组件库的js和css文件。

    现在我们的项目体积基本已经没有什么问题
    在这里插入图片描述

    首页内容定制

    我们可以根据不同的环境来定制首页内容。通过插件来进行配置,参考如下:在这里插入图片描述

    在pubilc/index.html中根据isProd的值来决定如何渲染页面结构:

    1. 指定标题在不同模式下显示:

    在这里插入图片描述

    1. 资源加载判断:在这里插入图片描述

    路由懒加载

    打包项目后js文件太大,会影响我们的页面打开加载速度,因此我们需要把js文件分割成多个代码块,然后当我们的路由访问时再加载相对应的组件。常用的有三种方式
    1. vue异步组件
    2. es提案的import()
    3. webpack的require,ensure()

    这里我们采用es提案的import()

    1. 首先我们需要安装@babel/plugin-syntax-dynamic-import包
    2. 再babel.config.js配置文件种声明该插件
    3. 将路由改为按需加载形式

    webpackChunkName后面是组名,将组件分组后最后同组的将被打包到同一js文件

    // import Home from './components/Home.vue'
    // 在一般情况下一个组件会被打包出一个js文件,
    // 但是我们指定相同的webpackChunkName的组件将被打包在统一js文件
    const Home = () => import(/* webpackChunkName: "group-foo" */ './Home.vue')
    

    具体参考文档
    https://router.vuejs.org/zh/guide/advanced/lazy-loading.html

    展开全文
  • vue项目打包上线流程

    2020-09-25 07:59:23
    我们在完成项目打包上线的时候,会发现他的文件很大,这个时候我就需要对项目先做一些优化,优化之后在进行打包 一、项目打包之前的优化 1. 通过 externals 加载外部 CDN 资源 默认情况下,通过 import 语法导入的...

    作用:

    我们在完成项目打包上线的时候,会发现他的文件很大,这个时候我就需要对项目先做一些优化,优化之后在进行打包

    一、项目打包之前的优化

    1. 通过 externals 加载外部 CDN 资源

    默认情况下,通过 import 语法导入的第三方依赖包,最终会被打包合并到同一个文件中,从而导致打包成功
    后,单文件体积过大的问题。
    为了解决上述问题,可以通过 webpack 的 externals 节点,来配置并加载外部的 CDN 资源。凡是声明在
    externals 中的第三方依赖包,都不会被打包。

    config.set('externals', {
     vue: 'Vue', 'vue-router': 'VueRouter',
    axios: 'axios',
    lodash: '_',
    echarts: 'echarts',
    nprogress: 'NProgress', 'vue-quill-editor': 'VueQuillEditor'
    })
    
    

    同时,需要在 public/index.html 文件的头部,添加如下的 CDN 资源引用

    <!-- nprogress 的样式表文件 --> <link rel="stylesheet" href="https://cdn.staticfile.org/nprogress/0.2.0/nprogress.min.css" />
    <!-- 富文本编辑器 的样式表文件 -->
    <link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.core.min.css" />
    <link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.snow.min.css" />
    <link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.bubble.min.css" />
    <!--同时,需要在 public/index.html 文件的头部,添加如下的 CDN 资源引用-->
    <script src="https://cdn.staticfile.org/vue/2.5.22/vue.min.js"></script>
    <script src="https://cdn.staticfile.org/vue-router/3.0.1/vue-router.min.js"></script>
    <script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>
    <script src="https://cdn.staticfile.org/lodash.js/4.17.11/lodash.min.js"></script>
    <script src="https://cdn.staticfile.org/echarts/4.1.0/echarts.min.js"></script>
    <script src="https://cdn.staticfile.org/nprogress/0.2.0/nprogress.min.js"></script>
    <!-- 富文本编辑器的 js 文件 -->
    <script src="https://cdn.staticfile.org/quill/1.3.4/quill.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue-quill-editor@3.0.4/dist/vue-quill-editor.js"></script>
    

    2.通过 CDN 优化 ElementUI 的打包
    虽然在开发阶段,我们启用了 element-ui 组件的按需加载,尽可能的减少了打包的体积,但是那些被按需加
    载的组件,还是占用了较大的文件体积。此时,我们可以将 element-ui 中的组件,也通过 CDN 的形式来加
    载,这样能够进一步减小打包后的文件体积。

    具体操作流程如下:
    ① 在 main-prod.js 中,注释掉 element-ui 按需加载的代码
    ② 在 index.html 的头部区域中,通过 CDN 加载 element-ui 的 js 和 css 样式

    <!-- element-ui 的样式表文件 --> <link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.8.2/themechalk/index.css" />
    <!-- element-ui 的 js 文件 -->
    <script src="https://cdn.staticfile.org/element-ui/2.8.2/index.js"></script>
    
    

    3、路由懒加载
    当打包构建项目时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成
    不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。

    具体需要 3 步:

    ① 安装 @babel/plugin-syntax-dynamic-import 包。
    ② 在 babel.config.js 配置文件中声明该插件。
    ③ 将路由改为按需加载的形式,示例代码如下

    const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')
    const Bar = () => import(/* webpackChunkName: "group-foo" */ './Bar.vue')
    const Baz = () => import(/* webpackChunkName: "group-boo" */ './Baz.vue')
    

    二、项目打包上线的流程

    1、在项目文件夹下运行npm run build
    2、我们会发现在原来的项目文件夹中多出了一个dist文件夹,这个文件夹就是我们要放到线上的内容
    我们把这个dist文件夹给到后端的工作人员,后端的工作人员,后端的工作人员就会把这个文件挂载到后端服务器上
    现在我们把dist文件夹里的内容放在htdocs文件夹中

    展开全文
  • vue项目打包上线流程以及遇到的问题 1.打包上线过程 1.1如何打包? 在项目的package.json文件中的build命令可以实现打包。 在终端执行命令npm run build,会在项目根目录下生成一个dist文件夹,打开文件夹如图。 ...
  • 我们在完成项目打包上线的时候,会发现他的文件很大,这个时候我就需要对项目先做一些优化,优化之后在进行打包 一、项目打包之前的优化 1. 通过 externals 加载外部 CDN 资源 默认情况下,通过 import 语法导入的第...
  • vue-cli3 脚手架搭建完成后,项目目录中没有 vue.config.js 文件,需要手动创建 在里面配置: module.exports = { productionSourceMap: false, //不输出map文件 } 配置后启动打包命令:npm run build 2.开启CDN...
  • vue项目打包App

    千次阅读 2017-12-23 13:58:57
    本地的vue项目打包成App。这里以Hbuilder为例。首选命令行进入项目的目录执行 npm run build   打包成功之后再项目下回生成一个dlist 文件夹。在Hbuilder中导入dlist文件夹。选中项目右键选择转换成移动App。 ...
  • 1.1、使用npm run build打包成最终要上线的代码 npm run build 然后会生成一个dist文件夹,然后把dist文件夹放到服务器中或给上线人员就可以了。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 507
精华内容 202
关键字:

vue项目打包流程

vue 订阅