潮流
潮流
  • 发布:2023-09-27 17:04
  • 更新:2026-06-25 11:04
  • 阅读:1087

cli模式vite+vue3差量编译机制

分类:uni-app

cli模式vite+vue3差量编译机制优化,项目体积大后(如:100+页面)差量编译巨慢,可以手动创建个100+项目试试,并且差量编译机制有问题,因为慢每次的代码修改后需要等上次差量编译完才能执行下一次代码修改,差量编译(假如为4s,4s内又有修改 是不会提前结束掉此次编译的 需要等上一次产量编译结束后才能开始 如果你在4s内保存了多久 那编译时间将是 4s*次数 ) 导致开发无法正常进行

2023-09-27 17:04 负责人:无 分享
已邀请:

最佳回复

DCloud_HB_WJ

DCloud_HB_WJ

在@飞翔的青蛙 电脑上验证了一下,确实是rollup内部机制导致的。手动关闭全部关于sourcemap相关的处理时速度有明显的提升。临时解决方案: 可以使用 https://www.npmjs.com/package/@uni_toolkit/vite-plugin-sourcemap-pro (和楼上@飞翔的青蛙发的逻辑差不多)
这个插件来解决。

后续我们内部也会修复相关问题。

  • DCloud_HB_WJ

    感谢@飞翔的青蛙 提供的复现环境

    2026-06-25 11:09

潮流

潮流 (作者)

同项目vue2差量编译时长在2s内,升级vue3后直接8s+ (无功能增加)

潮流

潮流 (作者)

up up up!

潮流

潮流 (作者)

up up up!

1***@qq.com

1***@qq.com

我也遇到了,请问解决了吗

k***@dingtalk.com

k***@dingtalk.com

请问解决了吗

a***@163.com

a***@163.com

请问解决了吗

  • [已删除]

    vue3 + vite 发行到什么平台, h5 还是那一家小程序?


    如果切换其他的发行平台,比如 h5 - 微信小程序 互相切换,能有改善吗?


    手动升级 vite 到 v4.3+ 或者 v5 版本能改善你的问题吗,尝试手动升级依赖。

    2024-01-19 16:36

  • [已删除]

    欢迎补充信息,并按照提示进行操作反馈,提供更多信息有助于解决定位解决你的问题

    2024-01-19 16:37

[已删除]

[已删除]

vue3 + vite 发行到什么平台, h5 还是那一家小程序?

如果切换其他的发行平台,比如 h5 - 微信小程序 互相切换,能有改善吗?

手动升级 vite 到 v4.3+ 或者 v5 版本能改善你的问题吗,尝试手动升级依赖。

  • 潮流 (作者)

    小程序,微信、阿里系都是一样,只有h5是正常的,升级最新的vite也是一样的

    2024-06-19 18:17

  • [已删除]

    回复 潮流: 嗯,明白了你的意思了。这是因为 h5 可以使用 dev 模式,而在其他方案里走的是 build 模式得到对应产物,需要完整走一次构建,这个就变成了对构建工具来说,只改动一部分逻辑多次构建,如何优化编译速度,或者相同的逻辑构建多次,后续是否可以命中缓存。这块你可以常识熟悉 rollup/vite 相关插件试试

    2024-06-21 15:30

  • 1***@qq.com

    回复 [已删除]: 那官方啥时候能优化下

    2024-11-24 09:20

前端逗比小黄

前端逗比小黄

同样有这个问题,巨慢,小项目没问题

  • 潮流 (作者)

    对吧

    2024-06-19 18:21

1***@qq.com

1***@qq.com

是的,差量编译8s,希望官网可以优化下。

飞翔的青蛙

飞翔的青蛙

解决了吗?

飞翔的青蛙

飞翔的青蛙

我这vue3 的uniapp项目差量编译10多分钟,而且内存拉满了,很卡,正常启动项目是3分钟

飞翔的青蛙

飞翔的青蛙

找官方大佬写了一个插件: 在vite.config.js中添加以下代码可以提升一些重载速度
然后在
export default defineConfig({

plugins: [killPluginSourcemaps()],  
build: {  
    sourcemap:false  

......  

});


  function killPluginSourcemaps() {  
    forceDisableSourcemap()  

    return {  
      name: 'kill-plugin-sourcemaps',  
      enforce: 'pre',  

      config() {  
        forceDisableSourcemap()  

        return {  
          build: {  
            sourcemap: false,  
            rollupOptions: {  
              output: {  
                sourcemap: false,  
                sourcemapExcludeSources: true,  
              },  
            },  
          },  
          css: {  
            devSourcemap: false,  
          },  
          esbuild: {  
            sourcemap: false,  
          },  
        }  
      },  

      configResolved(config) {  
        forceDisableSourcemap()  

        for (const plugin of config.plugins) {  
          if (plugin.name === 'kill-plugin-sourcemaps') continue  

          for (const hookName of ['load', 'transform', 'renderChunk']) {  
            const hook = plugin[hookName]  
            if (!hook) continue  

            if (typeof hook === 'function') {  
              plugin[hookName] = function (...args) {  
                return runWithoutSourcemap(hook, this, args)  
              }  
            } else if (hook && typeof hook.handler === 'function') {  
              const original = hook.handler  
              hook.handler = function (...args) {  
                return runWithoutSourcemap(original, this, args)  
              }  
            }  
          }  
        }  
      },  

      outputOptions(options) {  
        forceDisableSourcemap()  

        return {  
          ...options,  
          sourcemap: false,  
          sourcemapExcludeSources: true,  
        }  
      },  
    }  
  }  

  function forceDisableSourcemap() {  
    process.env.UNI_APP_SOURCEMAP = 'false'  
    process.env.GENERATE_SOURCEMAP = 'false'  
  }  

  function runWithoutSourcemap(fn, ctx, args) {  
    const noMapCtx = createNoMapContext(ctx)  
    const result = fn.apply(noMapCtx, args)  

    if (result && typeof result.then === 'function') {  
      return result.then(stripMap)  
    }  

    return stripMap(result)  
  }  

  function createNoMapContext(ctx) {  
    return new Proxy(ctx, {  
      get(target, key, receiver) {  
        if (key === 'getCombinedSourcemap') {  
          return () => null  
        }  

        const value = Reflect.get(target, key, receiver)  

        if (typeof value === 'function') {  
          return value.bind(target)  
        }  

        return value  
      },  
    })  
  }  

  function stripMap(result) {  
    if (!result) return result  

    if (typeof result === 'object' && 'map' in result) {  
      return {  
        ...result,  
        map: null,  
      }  
    }  

    return result  
  }  

要回复问题请先登录注册