hn-failte's blog hn-failte's blog
首页
  • 前端文章

    • JavaScript
    • Vue
    • React
    • Webpack
    • 混合开发
    • 小程序
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《React》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
    • 圆角边框锯齿问题
    • 各国语言正则
  • HTML&CSS
  • HTML
  • CSS
  • CSS预处理
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 算法
  • 数据库
  • 操作系统
  • 工具
  • 学习
  • 面试
  • 心情杂货
  • 前端相关
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

hn-failte

前端cv仔
首页
  • 前端文章

    • JavaScript
    • Vue
    • React
    • Webpack
    • 混合开发
    • 小程序
  • 学习笔记

    • 《JavaScript教程》笔记
    • 《JavaScript高级程序设计》笔记
    • 《ES6 教程》笔记
    • 《Vue》笔记
    • 《React》笔记
    • 《TypeScript 从零实现 axios》
    • 《Git》学习笔记
    • TypeScript笔记
    • JS设计模式总结笔记
    • 圆角边框锯齿问题
    • 各国语言正则
  • HTML&CSS
  • HTML
  • CSS
  • CSS预处理
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 算法
  • 数据库
  • 操作系统
  • 工具
  • 学习
  • 面试
  • 心情杂货
  • 前端相关
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Webpack

  • React

  • JavaScript

  • Vue

  • 混合开发

  • 学习笔记

  • 小程序

    • 基于 Taro 的微信小程序优化指南
    • Taro 分包异步化踩坑指南
      • 分析
      • 配置 webpack 进行文件拆分
      • 小程序分包异步化
  • 前端
  • 小程序
hn-failte
2023-05-13

Taro 分包异步化踩坑指南

# Taro 分包异步化踩坑指南

# 分析

安装 webpack-bundle-analyzer 分析依赖,找出体积大的第三方包

# 配置 webpack 进行文件拆分

先添加拆包配置

const reg1 = /[\\/]demo1[\\/]/;
const reg2 = /[\\/]demo2[\\/]/;

mini.webpackChain = (chain) => {
    // 获取 Taro 默认的 splitChunks 配置
    const splitChunks = chain.optimization.get("splitChunks");
    // 拆离出公共包
    splitChunks.cacheGroups = {
        ...splitChunks.cacheGroups,
        demo1: {
            test: reg1,
            name: "demo1",
            chunks: "all",
        },
        demo2: {
            test: reg2,
            name: "demo2",
            chunks: "all",
        }
    }
    chain.optimization.splitChunks({
    ...splitChunks,
    });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

在小程序引入的时候,引入新拆包的文件

// "runtime", "vendors", "taro", "common" 是 Taro 框架自带的配置
mini.commonChunks = ["runtime", "vendors", "taro", "common", "demo1","demo2"]
1
2

结果:文件实现了拆分,但是加载主包时仍然会加载拆分的包,且代码无法按通过 webpack 的 require 进行按需加载

总结:按需加载无法得到实现,webpack 的拆包对小程序意义不大

改进方案:基于小程序的 require 通过自定义 Taro 插件修改配置进行按需加载

# 小程序分包异步化

import type { IPluginContext } from '@tarojs/service'
import type Config from 'webpack-chain'
import { statSync, copyFileSync } from 'fs'
import { copySync } from 'fs-extra'
import { resolve, basename } from 'path'

interface WXRequireAsyncPluginOptions {
  sources: string[]
  dest: string
}

export default (ctx: IPluginContext, options: WXRequireAsyncPluginOptions) => {
  ctx.modifyWebpackChain(({ chain }: { chain: Config }) => {
    chain
      .merge({
        // 定义 wx_require 为微信小程序中的 require
        externals: {
          wx_require: 'require',
        },
      })
      .plugin('provide-plugin')
      .use(require('webpack').ProvidePlugin, [
        {
          wx_require: 'wx_require',
        },
      ])
  })

  // 把用 wx_require 的文件移到输出目录中
  ctx.onBuildFinish(() => {
    const { sources, dest } = options
    sources.forEach(source => {
      const stat = statSync(source)
      if (stat.isDirectory()) {
        copySync(source, dest)
      } else {
        copyFileSync(source, resolve(dest, basename(source)))
      }
    })
  })
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
let weappConfig = {
  sourceRoot: 'src',
  outputRoot: 'dist-weapp',
  env: {
    COMPILE_TYPE: '"weapp"',
  },
  plugins: [
    resolve(__dirname, '../scripts/taro.modify.config.plugin.ts'),
    [
      resolve(__dirname, '../scripts/taro.wx_require_async.plugin.ts'),
      {
        sources: PRIVATIZE ? [
          resolve(__dirname, '../src/lib/sdk.private.js'),
          resolve(__dirname, '../src/lib/im.private.js'),
        ] : [
          resolve(__dirname, '../demo1/'),
          resolve(__dirname, '../demo2/'),
        ],
        dest: resolve(__dirname, '../dist-weapp')
      },
    ],
  ],
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

结果:代码可以按需加载,但在按需加载的代码未从主包拆分出来

总结:主包的体积未得到拆分

改进方案:将按需加载的代码提取到分包

编辑 (opens new window)
#Taro#微信小程序
上次更新: 2024/01/26, 18:22:27
基于 Taro 的微信小程序优化指南

← 基于 Taro 的微信小程序优化指南

最近更新
01
safari 兼容问题笔记
01-26
02
electron 日志接入
12-26
03
vue3-template-compile
11-24
更多文章>
Theme by Vdoing | Copyright © 2017-2024 hn-failte | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式