vue-i18n报错:You are running the esm-bundler build of vue-i18n的解决方案

  • Post author:
  • Post category:vue


最近在Vue3+TS+Vite的项目开发中,使用vue-i8n遇到警告:


You are running the esm-bundler build of vue-i18n. It is recommended to configure your bundler to explicitly replace feature flag globals with boolean literals to get proper tree-shaking in the final bundle.

查看vue-i18n文档,找到这样的说明:

For Bundler feature flags

Build Feature Flags

The

esm-bundler

builds now exposes global feature flags that can be overwritten at compile time:


  • __VUE_I18N_FULL_INSTALL__

    (enable/disable, in addition to vue-i18n APIs, components and directives all fully support installation:

    true

    )

  • __VUE_I18N_LEGACY_API__

    (enable/disable vue-i18n legacy style APIs support, default:

    true

    )

  • __INTLIFY_PROD_DEVTOOLS__

    (enable/disable

    @intlify/devtools

    support in production, default:

    false

    )

NOTE:

__INTLIFY_PROD_DEVTOOLS__

flag is experimental, and

@intlify/devtools

is WIP yet.


The build will work without configuring these flags, however it is

strongly recommended

to properly configure them in order to get proper tree shaking in the final bundle. To configure these flags:

Note: the replacement value

must be boolean literals

and cannot be strings, otherwise the bundler/minifier will not be able to properly evaluate the conditions.

大体意思就是在使用包管理器的项目,如webpack、rollup、vite之类工具,需要配置vue-i18n的全局变量,以便在dev环境可以获得良好的提示,而在prod环境丢掉对于生产无用的代码以及按需引入得到tree shaking的效果。

那么,如何配置呢?我是vite项目,在vite官方找到这样的说明:

define




  • 类型:


    Record<string, any>

定义全局常量替换方式。其中每项在开发环境下会被定义在全局,而在构建时被静态替换。

  • String 值会以原始表达式形式使用,所以如果定义了一个字符串常量,

    它需要被显式地打引号。

    (例如使用

    JSON.stringify

  • 为了与

    esbuild 的行为

    保持一致,表达式必须为一个 JSON 对象(null、boolean、number、string、数组或对象),亦或是一个单独的标识符。

  • 替换只会在匹配到周围不是其他字母、数字、

    _



    $

    时执行。

WARNING

因为它是不经过任何语法分析,直接替换文本实现的,所以我们建议只对 CONSTANTS 使用

define

例如,

process.env.FOO



__APP_VERSION__

就非常适合。但

process



global

不应使用此选项。变量相关应使用 shim 或 polyfill 代替。

NOTE

对于使用 TypeScript 的开发者来说,请确保在

env.d.ts



vite-env.d.ts

文件中添加类型声明,以获得类型检查以及代码提示。

示例:

ts

// vite-env.d.ts
declare const __APP_VERSION__: string

NOTE

由于开发模式和构建模式实现

define

的差异性,我们应该避免采用一些可能导致不一致的用例。

例如:

js

const obj = {
  __NAME__, // 不要以缩写形式定义对象属性
  __KEY__: value // 不要定义对象的 key
}

简而言之,就是在项目

vite.config.ts

中进行如下配置:

 export default defineConfig({

      define: {__VUE_I18N_FULL_INSTALL__: true, __VUE_I18N_LEGACY_API__: true, __INTLIFY_PROD_DEVTOOLS__: false},

})

如果有类型检查报错,就像上面说的在


env.d.ts


添加类型说明:

// vite-env.d.ts
declare const __APP_VERSION__: string

至此,问题解决,不会有警告,而且推荐的功能也全用上了。



版权声明:本文为Ricky__H原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。