标签: Webpack

  • 你知道前端水印功能是怎么实现的吗?

    你知道前端水印功能是怎么实现的吗?

    携手创造,一起成长!这是我参加「日新计划 8 月更文应战」的第4天,点击检查活动详情。

    (更多…)

  • 我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现 null。这个在开发中呈现了底子没办法debug。有时候有上下文,仅仅中心呈现null还能揣度一下,假如提示一串null,那底子没办法开发。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现 null。这个在开发中呈现了底子没办法debug。有时候有上下文,仅仅中心呈现null还能揣度一下,假如提示一串null,那底子没办法开发。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现 null。这个在开发中呈现了底子没办法debug。有时候有上下文,仅仅中心呈现null还能揣度一下,假如提示一串null,那底子没办法开发。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现 null。这个在开发中呈现了底子没办法debug。有时候有上下文,仅仅中心呈现null还能揣度一下,假如提示一串null,那底子没办法开发。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现 null。这个在开发中呈现了底子没办法debug。有时候有上下文,仅仅中心呈现null还能揣度一下,假如提示一串null,那底子没办法开发。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现 null。这个在开发中呈现了底子没办法debug。有时候有上下文,仅仅中心呈现null还能揣度一下,假如提示一串null,那底子没办法开发。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

    我从 webpack 换到 vite,又换回了 webpack

    假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现 null。这个在开发中呈现了底子没办法debug。有时候有上下文,仅仅中心呈现null还能揣度一下,假如提示一串null,那底子没办法开发。

    我从 webpack 换到 vite,又换回了 webpack

    CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。

    由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。

    正是由于处理机制的不同,导致 Vite 下循环引证的文件都会呈现调用栈为 null 的状况。

    找了个webpack插件circular-dependency-plugin 查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回webpack了。

    我从 webpack 换到 vite,又换回了 webpack

    webpack 的优化

    webpack 仍是用官方封装的 Vue CLI

    缓存

    webpack4 仍是运用 hard-source-webpack-plugin 为模块供给中心缓存的,可是 webpack5 现已内置了该功用。

    module.exports = {
      chainWebpack(config) {
        config.cache(true)
      }
    }
    

    hard-source-webpack-plugin 作者现已被 webpack 招安了,原插件也现已不保护了,所以有条件仍是升级到 webpack5

    esbuild 编译

    编译能够运用 esbuild-loader 来替换 babel-loader,打包这一块就和 Vite 相差不多了。

    我从 webpack 换到 vite,又换回了 webpack

    看了下 vue-cli 的装备,需求换的 rule 是这几个。大约的装备如下:

    chainWebpack(config) {
    const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            jsxFactory: 'h',
    	jsxFragment: 'Fragment',
    	loader: 'jsx',
    	target: 'es2015'
          })
          .end()
    const tsRule = config.module.rule('typescript')
        tsRule.uses.clear()
        tsRule
          .use('ts')
          .loader('esbuild-loader')
          .end()
    }
    

    留意,上面的 jsx 装备只适用于 Vue3,由于 Vue2 没有露出 h 办法。

    假如要在 Vue2 上运用 jsx 解析,得需求一个解析 Vue2 语法完好运转时的包。
    pnpm i @lancercomet/vue2-jsx-runtime -D

    React 关于全新 JSX 转化的思维
    @lancercomet/vue2-jsx-runtime github

    大约便是把 jsx transform结构单独移了出来,以脱离结构适配 SWCTSC 或许 ESBuildjsx transform

        const rule = config.module.rule('js')
        // 整理自带的babel-loader
        rule.uses.clear()
        // 增加esbuild-loader
        rule
          .use('esbuild-loader')
          .loader('esbuild-loader')
          .options({
            target: 'es2015',
            loader: 'jsx',
            jsx: 'automatic',
            jsxImportSource: '@lancercomet/vue2-jsx-runtime'
          })
          .end()
    

    一起需求修正 tsconfig.json

    {
      "compilerOptions": {
        ...
        "jsx": "react-jsx",  // Please set to "react-jsx". 
        "jsxImportSource": "@lancercomet/vue2-jsx-runtime"  // Please set to package name.
      }
    }
    

    类型查看

    类型查看这块开发时能够交给 IDE 来处理,没必要再跑一个线程。

      chainWebpack(config) {
        // disable type check and let `vue-tsc` handles it
        config.plugins.delete('fork-ts-checker')
      }
    

    代码紧缩

    这些其实功用影响现已不大了,聊胜于无。

    const { ESBuildMinifyPlugin } = require('esbuild-loader')
      chainWebpack(config) {
        config.optimization.minimizers.delete('terser')
        config.optimization.minimizer('esbuild').use(ESBuildMinifyPlugin, [{ minify: true, css: true }])
      }
    

    优化成果

    这是 Vue-CLI 优化之后的打包,现已和 Vite 底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。

    我从 webpack 换到 vite,又换回了 webpack

    我从 webpack 换到 vite,又换回了 webpack

    完毕

    Vite 的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。

    这便是本篇文章的全部内容了,感谢咱们的观看。

  • 二十张图片彻底讲明白Webpack设计理念、聊聊Redis在分布式方面的能力设计 | 酱酱的下午茶第121期

    二十张图片彻底讲明白Webpack设计理念、聊聊Redis在分布式方面的能力设计 | 酱酱的下午茶第121期

    Hello,又到了每天一次的下午茶时刻。酱酱们的下午茶新增优质作者介绍和码上板块,专注于开掘站内优质创作者和优质内容,欢迎咱们多提宝贵意见!

    (更多…)

  • Web 标准与前端开发  | 青训营笔记

    Web 标准与前端开发 | 青训营笔记

    这是我参与「第四届青训营 」笔记创造活动的第5天

    (更多…)