暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

nuxt打包后文件过大的优化

原创 浮游 2023-03-10
3788

在使用nuxt.js来做项目的时候,遇到了加载缓慢的问题。解决思路如下

1、大文件拆分

2、文件压缩

大文件拆分

通过nuxt build --analyze或者nuxt build -a命令来启用

在package.json中 添加–analyze,然后执行npm run build

企业微信截图_16784321483171.png

打包后如下:

拆分前的

image.png

在实际应用中,加载较大体积的资源耗费的时间也会相对较大,尤其在网速不给力的时候,会对页面性能造成很大的影响。因此,将这些模块拆分成更小的模块是非常必要的。

拆分后的

image.png

在nuxt.config.js中配置optimization

build: { optimization: { minimize: true, minimizer: [ // new CssMinimizerPlugin(), ], splitChunks: { // 生成 chunk 的最小体积(以 bytes 为单位) chunks: "all", automaticNameDelimiter: "-", maxSize: 102400, cacheGroups: { vendors: { test: /[\\/]node_modules[\\/]/, priority: -10, //优先级 reuseExistingChunk: true, }, common: { minChunks: 2, priority: -20, //优先级 reuseExistingChunk: true, }, }, }, }, }

可以通过配置nuxt.config.js以提取大体积模块

在项目中的nuxt.config.js中添加cacheGroups选项,将一些体积较大的模块过滤出来生成单独的文件。我在nuxt.config.js中增加了两个cacheGroups分别打包vuetify和common。由于vendors的cacheGroups的priority是-10,高于commons,所以某一模块即使符合commons的test的正则表达式,也会优先被打包进去vuetify中。

在实际项目中,可以根据项目中依赖模块的实际情况,进行分组,使得打包出来的模块尽可能小。

文件压缩,使用gzip压缩

GNU zip 压缩格式,也是互联网上最流行的压缩格式。

HTTP 协议为此定义了两个 Accept 请求头字段和两个 Content 实体头字段,用于客户端和服务器进行“内容协商”。也就是说,客户端用 Accept 头告诉服务器希望接收什么样的数据,而服务器用 Content 头告诉客户端实际发送了什么样的数据。

image.png

Accept字段标记的是客户端可理解的 MIME type,可以用“,”做分隔符列出多个类型,让服务器有更多的选择余地,例如下面的这个头:
Accept-Encoding字段标记的是客户端支持的压缩格式,例如上面说的 gzip、deflate 等,同样也可以用“,”列出多个,服务器可以选择其中一种来压缩数据,实际使用的压缩格式放在响应头字段Content-Encoding里。

Accept-Encoding: gzip, deflate, br
Content-Encoding: gzip

不过这两个字段是可以省略的,如果请求报文里没有 Accept-Encoding 字段,就表示客户端不支持压缩数据;如果响应报文里没有 Content-Encoding 字段,就表示响应数据没有被压缩。

安装compression-webpack-plugin

npm install --save-dev compression-webpack-plugin@4.0.1

使用compression-webpack-plugin

//nuxt.config.js

const CompressionWebpackPlugin = require('compression-webpack-plugin')

module.exports = {
 build: {
    extend(config, { isDev, isClient }) {
      if (!isDev && isClient) {
        config.plugins.push(
          new CompressionWebpackPlugin({
            filename: '[path].gz', 
            algorithm: 'gzip',
            test: /\.(js|css|html|svg)$/,  // 匹配文件名
            threshold: 10240, // 对超过10kb的数据进行压缩
            minRatio: 0.8,
            deleteOriginalAssets: false, // 是否删除原文件
          })
        )
      }
    },
  }
}

这样设置以后,npm run build打包完基本上整个dist文件夹里全是gz压缩包。

最后修改时间:2023-03-10 16:04:42
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论