我正在参与「启航方案」
标签: Webpack
-
你知道前端水印功能是怎么实现的吗?
携手创造,一起成长!这是我参加「日新计划 8 月更文应战」的第4天,点击检查活动详情。
-
我从 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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
前言
(更多…)CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
前言
(更多…)假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现
null
。这个在开发中呈现了底子没办法debug
。有时候有上下文,仅仅中心呈现null
还能揣度一下,假如提示一串null
,那底子没办法开发。CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
前言
(更多…)看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现
null
。这个在开发中呈现了底子没办法debug
。有时候有上下文,仅仅中心呈现null
还能揣度一下,假如提示一串null
,那底子没办法开发。CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
前言
(更多…)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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现
null
。这个在开发中呈现了底子没办法debug
。有时候有上下文,仅仅中心呈现null
还能揣度一下,假如提示一串null
,那底子没办法开发。CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
前言
(更多…)CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现
null
。这个在开发中呈现了底子没办法debug
。有时候有上下文,仅仅中心呈现null
还能揣度一下,假如提示一串null
,那底子没办法开发。CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
前言
(更多…)看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现
null
。这个在开发中呈现了底子没办法debug
。有时候有上下文,仅仅中心呈现null
还能揣度一下,假如提示一串null
,那底子没办法开发。CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
前言
(更多…)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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现
null
。这个在开发中呈现了底子没办法debug
。有时候有上下文,仅仅中心呈现null
还能揣度一下,假如提示一串null
,那底子没办法开发。CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
前言
(更多…)看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
假如是其他文件的循环引证,也能够梳理更改。可是吊诡的当地在于,调用栈会呈现
null
。这个在开发中呈现了底子没办法debug
。有时候有上下文,仅仅中心呈现null
还能揣度一下,假如提示一串null
,那底子没办法开发。CommonJs 与 ESM 关于循环依靠的处理的战略是天壤之别的,webpack 在运转时注入的webpack_require逻辑在处理循环依靠时的体现与 CommonJs 规范共同。Webapck 依据 moduleId,先到缓存里去找之前有没有加载过,假如有加载过,就直接拿缓存中的模块。假如没有,就新建一个 module,并赋值给缓存中,然后调用 moduleId 模块。所以由于缓存的存在,呈现循环依靠时才不会呈现无限循环调用的状况。
由于 ESM 的静态 import 才能,能够在代码运转之前对依靠链路进行静态剖析。所以在 ESM 形式下,一旦发现循环依靠,ES6 自身就不会再去执行依靠的那个模块了,所以程序能够正常完毕。这也说明晰 ES6 自身就支撑循环依靠,确保程序不会由于循环依靠陷入无限调用。
正是由于处理机制的不同,导致
Vite
下循环引证的文件都会呈现调用栈为null
的状况。找了个
webpack
插件circular-dependency-plugin
查看了一下循环引证的文件,发现像下面这样跨多组件引证的当地有几十处。改代码也不太实际,只能先换回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
相差不多了。看了下
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
从结构单独移了出来,以脱离结构适配SWC
,TSC
或许ESBuild
的jsx 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
底子共同了。至于开发,两者的逻辑不相同,热更新确实是慢。完毕
Vite
的生态现已很丰厚了,底子能满意绝大多数的需求了。咱们这次搬迁由于平常开发留传的一些问题而失利了。应该检讨平常写代码不能只为了快,而疏忽一些细节。这便是本篇文章的全部内容了,感谢咱们的观看。
前言
(更多…) -
二十张图片彻底讲明白Webpack设计理念、聊聊Redis在分布式方面的能力设计 | 酱酱的下午茶第121期
Hello,又到了每天一次的下午茶时刻。酱酱们的下午茶新增优质作者介绍和码上板块,专注于开掘站内优质创作者和优质内容,欢迎咱们多提宝贵意见!