vue-cli3打包成zip压缩文件

目前在我司,采用前后分离的方式开发,这就会面临一个问题。那就是部署到服务器时如何部署?我们之前的方式是:执行打包命令生成文件夹-> 将文件压缩成zip -> 将zip上传至服务器 ->解压缩 -> 重启服务。

在测试阶段每天都要回归bug,所以每天都要重复执行上述操作。有没有更自动化一些的方式来实现呢?

就有了自动化部署,但我在研究自动化部署前,其实我是想在打包的时候自动生成zip文件,然后本地的脚本读取zip并上传至服务器,还有一种思路就是上传脚本可以进行打包压缩zip等。

因为我们还有其他部署方式,所以我采用生成zip包与自动部署2步走的方案。

如何实现?

首先项目框架是vue-cli3,我们也都知道vue-cli内置了我们常用的一些webpack配置,比如css压缩、动态生成html等,但它也提供了扩展的方式。

vue-cli3 的webpack配置都放在了根目录下的vue.config.js中。

生成zip的插件是:filemanager-webpack-plugin

(1) 安装依赖 npm install filemanager-webpack-plugin --dev

(2) 打开vue.config.js进行修改。代码如下:

const FileManagerPlugin = require("filemanager-webpack-plugin"); //引入
const packageName = 'dist';
var path = require('path')
module.exports = {
  productionSourceMap: false,
  outputDir: packageName, // 包名,我这里将他提取成了一个常量
  devServer: {
    open: true, // 默认打开
    port: 8001, // 本地服务端口口
    proxy: {
        // 代理
      "/api": {
        target: '192.168.162.73:8085', //服务器地址
        changeOrigin: true,
        ws: true,
        pathRewrite: {
          "^/api": ""
        }
      }
    }
  },
  // webpack配置
  configureWebpack: config => {
    config.resolve = {
      extensions: ['.js', '.vue', '.json', '.ts'],
      alias: {
        '@': path.join(__dirname, 'src')
      }
    }
    // plugins插件是一个数组且webpack本身已经有一些配置,那么我们需要将其追加到数组中
    let fileManagerPlugin = new FileManagerPlugin({ 
      onEnd: {
        delete: [   //首先需要删除项目根目录下的dist.zip
          `./${packageName}.zip`,   
        ],
        archive: [ //然后我们选择dist文件夹将之打包成dist.zip并放在根目录
          {source: `./${packageName}`, destination: `./${packageName}.zip`},   
        ]
      }
    })
    config.plugins.push(fileManagerPlugin) // 追加到webpack plugins数组中。
  }
};

(3) 执行npm run build ,默认会执行此配置文件。会发现根目录下不仅有dist文件夹,还有dist.zip文件夹。

思考

我们在生成文件前先进行删除本地dist.zip文件,可根据自己情况选择。

它默认会先删除本地的dist.zip文件夹,如果是第一次打包其实没有此文件,它会不会报错呢?你可以尝试一下,事实上是不报错的。

vue-cli3打包优化

vue项目打包是需要做一些性能优化的,这篇文章里我写了关于我知道的要做的优化的部分,仅供参考。

const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
const path = require('path')
// 开启Gzip需要的依赖 yarn add compression-webpack-plugin -D
const CompressionWebpackPlugin = require('compression-webpack-plugin')
function resolve(dir) {
    return path.join(__dirname, dir)
}
// 标记是否是生产环境
const isPruction = process.env.NODE_ENV === "production" 
const devNeedCdn = false // 标记本地是否需要cdn引入
// cdn配置
// CDN的本质上是将媒体资源,动静态图片(Flash),HTML,CSS,JS等等内容缓存到距离你更近的IDC,
// 从而让用户进行共享资源,实现缩减站点间的响应时间等等需求,而网游加速器的本质则是通过建立高带宽机房,
// 架设多节点服务器来为用户进行加速。我们可以将一些大体积的模块,让cdn帮我们提供相应的资源,
// 这样就可以缓解我们自己的服务器的压力,同时提供更快更好的资源响应

const cdn = {
    // 模块名称和作用域名(对应的是window里面的全局变量名)
    external: {
        vuex: 'Vuex',
        'vue-router': 'VueRouter'
    },
    //cdn的css链接
    css: [],
    //cdn的js连接 这里的资源地址请根据自己的连接
    js: [
        'https://cdn.staticfile.org/vuex/3.0.2/vuex.min.js', 
        'https://cdn.staticfile.org/vue-router/3.0.2/vue-router.min.js'
    ]
}
module.exports = {
    // devServer : {
    //     proxy: 'localhost:8080'
    // },
    productionSourceMap: false, // 上线后不生成map文件
    chainWebpack: (config) => {
        // 配置路径别名
        config.resolve.alias
        .set('@', resolve('src'))
        .set('components', resolve('src/components'))
        .set('assets', resolve('src/assets'))
        .set('api', resolve('src/api'))
        .set('views', resolve('src/views'))
        // 上线压缩图片 首先要安装 image-webpack-loader 命令 yarn add image-webpack-loader -D
        config.module.rule('images')
        .use('image-webpack-loader')
        .loader('image-webpack-loader')
        .options({bypassOnDebug:true})
        .end()

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

    configureWebpack: config => {
        // 用cdn方式引入,则构建时要忽略相关资源
        if (isPruction || devNeedCdn) {
            config.externals = cdn.externals
        } 
        if(isPruction) { // 判断是否是生产环境
            config.mode = "production";
            // 上线关闭console和debugger
            // 代码压缩
            config.optimization.minimizer = [
                new UglifyJsPlugin({
                    uglifyOptions: {
                        compress: {
                            warnings: false, // 如果打包产生错误 可注释掉这里
                            drop_console: true,
                            drop_debugger: true,
                            pure_funcs: ['console.log']
                        }
                    }
                })
            ]
            // 打包文件大小配置
            config["performance"] = {
                "maxEntrypointSize": 10000000, // 此选项根据入口起点的最大体积,控制 webpack 何时生成性能提示 单位是(bytes)
                "maxAssetSize": 3000000 // 此选项根据单个资源体积,控制 webpack 何时生成性能提示 单位是(bytes)
            }

            // gzip压缩
            const productionGzipExtensions = ['html', 'js', 'css']
            config.plugins.push({
                filename:'[path].gz[query]',
                algorithm: 'gzip',
                test: new RegExp( // 进行压缩的文件类型
                    '\\.('   productionGzipExtensions.join('|')   ')$'
                ),
                threshold: 10240, // 定义只有大小大于该值的资源会被处理
                minRatio: 0.7, // 只有压缩率小于这个值的资源被处理
                deleteOriginalAssets: false // 删除原文件
            })

            // 公共代码抽离
            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'
                    }
                }
            }
        } else {
            config.mode = 'development'
        }
    }
}

cdn配置如果添加了那么html文件也要做相应的修改,这里是修改后的html文件

	<!DOCTYPE html>
<html lang="">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico" rel="external nofollow" >
    <!-- 使用CDN的CSS文件 -->
    <% for (var i in htmlWebpackPlugin.options.cdn &&
    htmlWebpackPlugin.options.cdn.css) { %>
    <link
        href="<%= htmlWebpackPlugin.options.cdn.css[i] %>" rel="external nofollow" 
        rel="stylesheet"
    />
    <% } %>
    <title><%= htmlWebpackPlugin.options.title %></title>
  </head>
  <body>
    <noscript>
      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
    </noscript>
    <div id="app"></div>
    <!-- built files will be auto injected -->
     <!-- 使用CDN的JS文件 -->
     <% for (var i in htmlWebpackPlugin.options.cdn &&
     htmlWebpackPlugin.options.cdn.js) { %>
     <script src="<%= htmlWebpackPlugin.options.cdn.js[i] %>"></script>
     <% } %>
  </body>
</html>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持Devmax。

vue-cli3中如何打包成zip压缩文件的更多相关文章

  1. xcode – xcrun因zip I / O错误而失败:没有这样的文件或目录zip错误:

    尝试使用xcrun导出存档失败,出现以下错误:解决方法xcrun需要绝对路径.(即/User/you/…

  2. ios – 如何从我的文档目录创建.zip文件?

    我想从我的文档目录创建一个ZIP文件.我也想把它作为电子邮件附件发送.解决方法ZipArchive是一个压缩或解压缩zip文件的Objective-C类,它基于开源代码“MiniZip”.它可用于iPhone应用程序开发,也可用于MacOSX上的cocoa.看到这个:http://code.google.com/p/ziparchive/downloads/list

  3. android – 在SDCard上创建带有一些文件的zip文件

    正如我几天前发布的一个问题,我意识到股票电子邮件应用程序无法发送附件中的多个文件:https://stackoverflow.com/questions/5773006/sending-email-with-multiple-attachement-fail-with-default-email-android-app-but不幸的是,我没有得到答案,所以需要找到一个解决方法.用户必须在列表中选择

  4. android – 在apk中将apk转换为zip可以在clockWorkMod中闪存吗?

    如何将apk转换为可在clockWorkMod中刷新的zip?我尝试过使用ApkInstaller.它没用.继续得到错误;“安装中止”.解决方法您只需将应用程序的.apk扩展名更改为.zip然后将.zip放入SD卡中,看看是否可以使用CWM闪存.我不知道你想要做什么,所以如果你能指定更多的信息会很棒.如果您想要的只是将应用程序安装到手机中,那么您可以按照此tutorial进行操作.

  5. android-emulator – 在Android Studio中安装带有zip文件的Android Emulator

    我无法在我的androidstudio安装中安装模拟器,所以我从工作室复制了这个链接并下载了zip文件……

  6. 从您的Android资产文件夹中的ZIP文件中读取文件

    我正在使用ZipInputStream从位于我的Android资产文件夹的ZIP文件中读取文件:它的工作原理很慢,因为它必须使用getNextEntry()顺序读取它,并且有相当多的文件.如果我将ZIP文件复制到SD卡上,使用ZipFile.getEntry时,阅读速度非常快,但是我没有找到使用ZipFile资源文件的方法!有没有办法以快速方式访问资产文件夹中的ZIP?我认为访问ZIP文件在两个不同的位置将是一个简单的方法来处理这个,但唉...)解决方法这对我有用:

  7. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  8. vue打包chunk-vendors.js文件过大导致页面加载缓慢的解决

    这篇文章主要介绍了vue打包chunk-vendors.js文件过大导致页面加载缓慢的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  9. php打包网站并在线压缩为zip

    这篇文章主要介绍了php打包网站并在线压缩为zip的相关资料,具有一定的参考价值,需要的朋友可以参考下

  10. electron打包vue项目的方法 步骤

    本文主要介绍了electron打包vue项目,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

随机推荐

  1. js中‘!.’是什么意思

  2. Vue如何指定不编译的文件夹和favicon.ico

    这篇文章主要介绍了Vue如何指定不编译的文件夹和favicon.ico,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. 基于JavaScript编写一个图片转PDF转换器

    本文为大家介绍了一个简单的 JavaScript 项目,可以将图片转换为 PDF 文件。你可以从本地选择任何一张图片,只需点击一下即可将其转换为 PDF 文件,感兴趣的可以动手尝试一下

  4. jquery点赞功能实现代码 点个赞吧!

    点赞功能很多地方都会出现,如何实现爱心点赞功能,这篇文章主要为大家详细介绍了jquery点赞功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. AngularJs上传前预览图片的实例代码

    使用AngularJs进行开发,在项目中,经常会遇到上传图片后,需在一旁预览图片内容,怎么实现这样的功能呢?今天小编给大家分享AugularJs上传前预览图片的实现代码,需要的朋友参考下吧

  6. JavaScript面向对象编程入门教程

    这篇文章主要介绍了JavaScript面向对象编程的相关概念,例如类、对象、属性、方法等面向对象的术语,并以实例讲解各种术语的使用,非常好的一篇面向对象入门教程,其它语言也可以参考哦

  7. jQuery中的通配符选择器使用总结

    通配符在控制input标签时相当好用,这里简单进行了jQuery中的通配符选择器使用总结,需要的朋友可以参考下

  8. javascript 动态调整图片尺寸实现代码

    在自己的网站上更新文章时一个比较常见的问题是:文章插图太宽,使整个网页都变形了。如果对每个插图都先进行缩放再插入的话,太麻烦了。

  9. jquery ajaxfileupload异步上传插件

    这篇文章主要为大家详细介绍了jquery ajaxfileupload异步上传插件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  10. React学习之受控组件与数据共享实例分析

    这篇文章主要介绍了React学习之受控组件与数据共享,结合实例形式分析了React受控组件与组件间数据共享相关原理与使用技巧,需要的朋友可以参考下

返回
顶部