当前位置: 首页 > 知识库问答 >
问题:

静态变量 - 为什么vite+typescript+vue3 编译的代码浏览器不支持?

傅和璧
2023-12-19
export class UserService {    private static _instance: UserService = new UserService()    static getInstance() {        return UserService._instance    }}

使用vite打包后转成了

class _ {    static _instance = new _;}

但是转化的 语法在老浏览器不支持(es6 不支持 static 声明类变量),请求有知道如何解决的吗?

我尝试了使用babel,但是不知道如何配置

共有2个答案

谢灵均
2023-12-19

Vue3已经放弃老版本IE了:

https://github.com/vuejs/rfcs/blob/master/active-rfcs/0038-vue3-ie11-support.md
https://babeljs.io/docs/en/learn/

不过可以试试这个:

https://juejin.cn/post/7114586736201580575
崔单弓
2023-12-19

首先,让我们理解一下你遇到的问题。你使用 Vite、TypeScript 和 Vue 3 打包后的代码在老版本的浏览器中不支持,特别是 ES6 不支持的 static 声明类变量。

为了解决这个问题,你可以使用 Babel 来转换你的代码。Babel 是一个 JavaScript 编译器,它可以将 ES6+ 代码转换为向后兼容的 JavaScript 版本。

下面是如何配置 Babel 的步骤:

  1. 首先,确保你已经安装了 Babel 的相关依赖。你可以使用 npm 或 yarn 来安装它们:
npm install --save-dev @babel/core @babel/preset-env @babel/preset-typescript

或者

yarn add --dev @babel/core @babel/preset-env @babel/preset-typescript
  1. 创建一个 Babel 配置文件,例如 .babelrc,并添加以下内容:
{  "presets": [    [      "@babel/preset-env",      {        "targets": {          "browsers": ["last 2 versions", "ie >= 11"]        }      }    ],    "@babel/preset-typescript"  ]}

这将设置 Babel 转换目标为支持 IE11 以及最后两个浏览器的版本。

  1. 在 Vite 的配置文件(vite.config.jsvite.config.ts)中,确保你的 build.rollupOptions 配置包含了 Babel 的相关配置。例如:
import { defineConfig } from 'vite'// 如果你使用 TypeScript,还需要导入 tsconfig.json 文件中的compilerOptionsimport { compilerOptions } from './tsconfig.json'export default defineConfig({  build: {    rollupOptions: {      // 在这里添加 Babel 的配置      external: ['vue'], // 根据你的项目需要来设置 external 列表      output: {        // 设置变量名前缀,避免与全局冲突        chunkFileNames: 'static/js/[name]-[hash].js',        entryFileNames: 'static/js/[name]-[hash].js',        assetFileNames: 'static/assets/[name]-[hash].[ext]'      },      plugins: [        // 在这里添加 Babel 的插件和预设配置        // 例如:@babel/preset-env 和 @babel/preset-typescript 的配置文件路径等      ]    }  }})
  1. 最后,确保你的项目中的 TypeScript 文件(.ts)都被正确地转换为 JavaScript。在 Vite 中,TypeScript 会自动被转换,所以你只需要确保 Babel 可以正确地处理它们。如果你在 Babel 中没有正确配置 TypeScript,可能会遇到类型错误的问题。在 .babelrc 文件中添加 "@babel/preset-typescript" 可以解决这个问题。
  2. 重新运行 Vite 来构建你的项目。这次,Babel 会将你的代码转换为老版本浏览器兼容的语法。你应该能够看到转换后的代码与原始代码有所不同,但它们的功能应该是相同的。
 类似资料:
  • gRPC基于HTTP/2,浏览器广泛支持HTTP/2(假设)。因此,我觉得从浏览器使用gRPC应该没有问题。 然而,很明显有一个问题。协议grpc web是不同的,因为“由于浏览器限制”而存在。还有许多博客文章描述了为让gRPC从浏览器工作而部署的复杂技术堆栈。 我忽略了实际的问题——为什么gRPC不只是在浏览器上工作?

  • 我正在做一个测试,Firefox如何编码字符。 但事实让我困惑。 超文本标记语言代码: xxx是一些汉字。这些字符必须编码成%xx等格式才能通过HTTP传输。 首先,我用UTF-8编码源文件。使用firefox打开html文件。img标签将发送一个请求,“xxx”字符由UTF8编码。 (用UTF8编码HTML源文件,字符集=UTF8,浏览器用UTF编码URL) 我把meta改成了

  • 问题内容: 我指着一些窍门,发现了这一点。在以下代码中: 对象是。为什么这段代码没有抛出? 我知道这不是访问变量的正确方法,但问题在于。 问题答案: 如果要使用以下方法反汇编您的班级文件,请向当前答案中添加一些其他信息: 你会得到: 在这里,您可以看到该指令在第7行完成了对静态字段的访问。每当通过代码访问静态字段时,都会在程序文件中生成相应的指令。 指令具有特殊性,即它们不需要在调用它们之前就对要

  • 问题内容: 另外,在网上可以找到许多创建静态变量的解决方案。(尽管我还没有看到我喜欢的一个。) 为什么Python不支持方法中的静态变量?这被认为是非Python的,还是与Python的语法有关? 编辑: 我专门询问了 为什么 进行设计决策,但我没有提供任何代码示例,因为我想避免解释来模拟静态变量。 问题答案: 忽略这一点的想法是,静态变量仅在以下两种情况下才有用:何时真正应该使用类以及何时真正应

  • 问题内容: 为什么要编译Python脚本?您可以直接从.py文件运行它们,并且效果很好,那么在性能上有什么优势吗? 我还注意到,我的应用程序中的某些文件被编译为.pyc,而另一些则没有,为什么? 问题答案: 它被编译为字节码,可以更快,更快速地使用。 无法编译某些文件的原因是,每次运行脚本时都会重新编译与之一起调用的主脚本。所有导入的脚本将被编译并存储在磁盘上。 Ben Blank的 重要补充:

  • 变量被编译器声明为const,导致无法编译