@xiaonoodles/meetfun-i18n 1.2.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,245 @@
1
+ # Webpack 5 路径解析修复说明
2
+
3
+ ## 问题根源
4
+
5
+ Webpack 5 在处理 npm 包的子路径导入时,默认不会完全遵循 `package.json` 的 `exports` 字段。当使用 `import from 'meetfun-i18n/vue2'` 时,Webpack 会尝试查找物理路径 `node_modules/meetfun-i18n/vue2`。
6
+
7
+ ## 解决方案
8
+
9
+ 创建了一个真实的 `vue2/` 目录,其中包含:
10
+
11
+ ### 目录结构
12
+
13
+ ```
14
+ meetfun-i18n/
15
+ ├── dist/
16
+ │ ├── index.js # Vue3 版本
17
+ │ ├── index.esm.js
18
+ │ └── vue2/
19
+ │ ├── index.js # Vue2 实际代码
20
+ │ └── index.esm.js
21
+ ├── vue2/ # ← 新增物理目录
22
+ │ ├── package.json # 指向 dist/vue2
23
+ │ ├── index.js # CommonJS 入口
24
+ │ ├── index.mjs # ES Module 入口
25
+ │ └── index.d.ts # TypeScript 类型
26
+ └── package.json
27
+ ```
28
+
29
+ ### vue2/package.json
30
+
31
+ ```json
32
+ {
33
+ "main": "../dist/vue2/index.js",
34
+ "module": "../dist/vue2/index.esm.js",
35
+ "types": "../dist/vue2/index.d.ts"
36
+ }
37
+ ```
38
+
39
+ 这个文件告诉 Webpack:
40
+ - CommonJS (`require`) → 使用 `../dist/vue2/index.js`
41
+ - ES Module (`import`) → 使用 `../dist/vue2/index.esm.js`
42
+ - TypeScript → 使用 `../dist/vue2/index.d.ts`
43
+
44
+ ### vue2/index.js (CommonJS 入口)
45
+
46
+ ```javascript
47
+ module.exports = require('../dist/vue2/index.js')
48
+ ```
49
+
50
+ ### vue2/index.mjs (ES Module 入口)
51
+
52
+ ```javascript
53
+ export * from '../dist/vue2/index.esm.js'
54
+ export { default } from '../dist/vue2/index.esm.js'
55
+ ```
56
+
57
+ ## 工作原理
58
+
59
+ 现在当您使用:
60
+ ```javascript
61
+ import { createMeetFunI18n } from 'meetfun-i18n/vue2'
62
+ ```
63
+
64
+ Webpack 会:
65
+ 1. 找到 `node_modules/meetfun-i18n/vue2` 目录
66
+ 2. 读取 `vue2/package.json`
67
+ 3. 根据模块类型选择:
68
+ - ES Module → `vue2/index.mjs` → `dist/vue2/index.esm.js`
69
+ - CommonJS → `vue2/index.js` → `dist/vue2/index.js`
70
+ 4. 最终加载正确的 Vue2 版本代码
71
+
72
+ ## 多层保护
73
+
74
+ 我们提供了多种方式确保兼容性:
75
+
76
+ ### 1. 根目录入口文件
77
+ ```
78
+ vue2.js # CommonJS
79
+ vue2.mjs # ES Module
80
+ vue2.d.ts # TypeScript
81
+ ```
82
+
83
+ ### 2. vue2 目录
84
+ ```
85
+ vue2/
86
+ ├── package.json
87
+ ├── index.js
88
+ ├── index.mjs
89
+ └── index.d.ts
90
+ ```
91
+
92
+ ### 3. package.json exports
93
+ ```json
94
+ {
95
+ "exports": {
96
+ "./vue2": {
97
+ "types": "./vue2.d.ts",
98
+ "import": "./vue2.mjs",
99
+ "require": "./vue2.js"
100
+ }
101
+ }
102
+ }
103
+ ```
104
+
105
+ 无论打包工具采用哪种解析策略,都能正确找到 Vue2 版本的代码。
106
+
107
+ ## 验证方法
108
+
109
+ ### 1. 检查文件是否存在
110
+
111
+ ```bash
112
+ ls node_modules/meetfun-i18n/vue2/
113
+ # 应该看到:
114
+ # index.js index.mjs index.d.ts package.json
115
+ ```
116
+
117
+ ### 2. 检查是否加载正确
118
+
119
+ 在您的代码中添加:
120
+
121
+ ```javascript
122
+ import { createMeetFunI18n } from 'meetfun-i18n/vue2'
123
+
124
+ // 创建一个测试实例
125
+ const i18n = createMeetFunI18n({}, {
126
+ queryLangDictHotData: () => {},
127
+ queryLangDictColdData: () => {}
128
+ })
129
+
130
+ const instance = i18n.getI18n()
131
+
132
+ // 检查实例类型
133
+ console.log('i18n 类型:', instance.constructor.name)
134
+ // Vue2 应该输出: VueI18n
135
+ // Vue3 会输出: Composer
136
+
137
+ console.log('是否有 t 方法:', typeof instance.t)
138
+ // Vue2 应该输出: function
139
+ ```
140
+
141
+ ### 3. 清除缓存后重新安装
142
+
143
+ ```bash
144
+ # 删除 node_modules
145
+ rm -rf node_modules
146
+
147
+ # 删除锁文件
148
+ rm pnpm-lock.yaml
149
+
150
+ # 重新安装
151
+ pnpm install
152
+
153
+ # 清除构建缓存
154
+ rm -rf unpackage # uni-app
155
+ rm -rf .cache # Webpack
156
+
157
+ # 重新运行
158
+ npm run dev
159
+ ```
160
+
161
+ ## 常见问题
162
+
163
+ ### Q: 为什么需要这么多入口文件?
164
+
165
+ A: 不同的打包工具和配置有不同的模块解析策略:
166
+ - **现代打包工具**(支持 exports)→ 使用 package.json exports
167
+ - **Webpack 5**(部分支持)→ 查找物理目录 vue2/
168
+ - **老版本工具** → 使用根目录的 vue2.js/vue2.mjs
169
+
170
+ 这种多层设计确保最大兼容性。
171
+
172
+ ### Q: 如果还是报错怎么办?
173
+
174
+ A: 尝试以下步骤:
175
+
176
+ 1. **完全重新安装**
177
+ ```bash
178
+ rm -rf node_modules pnpm-lock.yaml
179
+ pnpm install
180
+ ```
181
+
182
+ 2. **清除所有缓存**
183
+ ```bash
184
+ rm -rf unpackage .cache dist
185
+ ```
186
+
187
+ 3. **检查 vue-i18n 版本**
188
+ ```bash
189
+ pnpm list vue-i18n
190
+ # Vue2 项目应该是 8.x.x
191
+ ```
192
+
193
+ 4. **强制安装正确版本**
194
+ ```bash
195
+ pnpm add vue-i18n@^8.0.0 --force
196
+ ```
197
+
198
+ ### Q: TypeScript 提示找不到模块?
199
+
200
+ A: 在 `tsconfig.json` 中添加:
201
+
202
+ ```json
203
+ {
204
+ "compilerOptions": {
205
+ "moduleResolution": "node",
206
+ "resolveJsonModule": true,
207
+ "esModuleInterop": true
208
+ }
209
+ }
210
+ ```
211
+
212
+ ## 更新步骤
213
+
214
+ 用户需要更新到最新版本:
215
+
216
+ ```bash
217
+ # 更新包
218
+ pnpm update meetfun-i18n
219
+
220
+ # 或指定版本
221
+ pnpm add meetfun-i18n@1.2.1
222
+
223
+ # 验证安装
224
+ ls node_modules/meetfun-i18n/vue2/
225
+ ```
226
+
227
+ ## 测试结果
228
+
229
+ 更新后,以下导入应该都能正常工作:
230
+
231
+ ```javascript
232
+ // ✅ 所有这些方式都应该能工作
233
+ import { createMeetFunI18n } from 'meetfun-i18n/vue2'
234
+ const { createMeetFunI18n } = require('meetfun-i18n/vue2')
235
+
236
+ // ✅ TypeScript 也能正确识别类型
237
+ import type { I18nConfig } from 'meetfun-i18n/vue2'
238
+ ```
239
+
240
+ ## 相关文档
241
+
242
+ - [TROUBLESHOOTING.md](./TROUBLESHOOTING.md) - 故障排除完整指南
243
+ - [TEST_IMPORT.md](./TEST_IMPORT.md) - 导入测试说明
244
+ - [VUE2_USAGE.md](./VUE2_USAGE.md) - Vue2 使用指南
245
+
package/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 meetfun
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
@@ -0,0 +1,253 @@
1
+ # Vue2/Vue3 迁移指南
2
+
3
+ 本文档帮助您在 Vue2 和 Vue3 项目之间迁移使用 meetfun-i18n。
4
+
5
+ ## 快速对比
6
+
7
+ | 特性 | Vue2 | Vue3 |
8
+ |------|------|------|
9
+ | **引入方式** | `import { createMeetFunI18n } from 'meetfun-i18n/vue2'` | `import { createMeetFunI18n } from 'meetfun-i18n'` |
10
+ | **Vue 版本** | Vue 2.7+ | Vue 3.x |
11
+ | **vue-i18n 版本** | 8.x | 9.x |
12
+ | **安装方式** | `Vue.use(i18n)` | `app.use(i18n)` |
13
+ | **API 使用** | 完全相同 ✅ | 完全相同 ✅ |
14
+
15
+ ## Vue2 项目示例
16
+
17
+ ### 1. 安装依赖
18
+
19
+ ```bash
20
+ pnpm add meetfun-i18n vue@^2.7.0 vue-i18n@^8.0.0
21
+ ```
22
+
23
+ ### 2. 初始化
24
+
25
+ ```javascript
26
+ // src/locales/index.js
27
+ import { createMeetFunI18n } from 'meetfun-i18n/vue2'
28
+ import zhHans from './zh-Hans.json'
29
+ import en from './en.json'
30
+ import { queryLangDictHotData, queryLangDictColdData } from '@/api/translate'
31
+
32
+ const baseMessages = {
33
+ 'zh-Hans': zhHans,
34
+ en: en,
35
+ }
36
+
37
+ const apiConfig = {
38
+ queryLangDictHotData,
39
+ queryLangDictColdData,
40
+ }
41
+
42
+ export default createMeetFunI18n(baseMessages, apiConfig, {
43
+ defaultLocale: 'zh-Hans',
44
+ systemCode: 'YOUR_SYSTEM_CODE',
45
+ })
46
+ ```
47
+
48
+ ### 3. 在 main.js 中安装
49
+
50
+ ```javascript
51
+ // main.js
52
+ import Vue from 'vue'
53
+ import App from './App.vue'
54
+ import i18nInstance from './locales'
55
+
56
+ // 安装 vue-i18n
57
+ Vue.use(i18nInstance.getI18n())
58
+
59
+ // 可选:挂载到原型
60
+ Vue.prototype.$i18nInstance = i18nInstance
61
+
62
+ new Vue({
63
+ i18n: i18nInstance.getI18n(),
64
+ render: h => h(App)
65
+ }).$mount('#app')
66
+ ```
67
+
68
+ ### 4. 在组件中使用
69
+
70
+ ```vue
71
+ <template>
72
+ <view>
73
+ <text>{{ $t('welcomeMessage') }}</text>
74
+ <button @click="changeLanguage">切换语言</button>
75
+ </view>
76
+ </template>
77
+
78
+ <script>
79
+ export default {
80
+ methods: {
81
+ changeLanguage() {
82
+ this.$i18nInstance.switchLocale('en')
83
+ }
84
+ }
85
+ }
86
+ </script>
87
+ ```
88
+
89
+ ## Vue3 项目示例
90
+
91
+ ### 1. 安装依赖
92
+
93
+ ```bash
94
+ pnpm add meetfun-i18n vue@^3.0.0 vue-i18n@^9.0.0
95
+ ```
96
+
97
+ ### 2. 初始化
98
+
99
+ ```typescript
100
+ // src/locales/index.ts
101
+ import { createMeetFunI18n } from 'meetfun-i18n'
102
+ import zhHans from './zh-Hans.json'
103
+ import en from './en.json'
104
+ import { queryLangDictHotData, queryLangDictColdData } from '@/api/translate'
105
+
106
+ const baseMessages = {
107
+ 'zh-Hans': zhHans,
108
+ en: en,
109
+ }
110
+
111
+ const apiConfig = {
112
+ queryLangDictHotData,
113
+ queryLangDictColdData,
114
+ }
115
+
116
+ export default createMeetFunI18n(baseMessages, apiConfig, {
117
+ defaultLocale: 'zh-Hans',
118
+ systemCode: 'YOUR_SYSTEM_CODE',
119
+ })
120
+ ```
121
+
122
+ ### 3. 在 main.ts 中安装
123
+
124
+ ```typescript
125
+ // main.ts
126
+ import { createSSRApp } from 'vue'
127
+ import App from './App.vue'
128
+ import i18nInstance from './locales'
129
+
130
+ export function createApp() {
131
+ const app = createSSRApp(App)
132
+
133
+ // 安装 vue-i18n
134
+ app.use(i18nInstance.getI18n())
135
+
136
+ return {
137
+ app,
138
+ }
139
+ }
140
+ ```
141
+
142
+ ### 4. 在组件中使用
143
+
144
+ ```vue
145
+ <template>
146
+ <view>
147
+ <text>{{ $t('welcomeMessage') }}</text>
148
+ <button @click="changeLanguage">切换语言</button>
149
+ </view>
150
+ </template>
151
+
152
+ <script setup lang="ts">
153
+ import i18nInstance from '@/locales'
154
+
155
+ const changeLanguage = () => {
156
+ i18nInstance.switchLocale('en')
157
+ }
158
+ </script>
159
+ ```
160
+
161
+ ## 从 Vue2 迁移到 Vue3
162
+
163
+ 如果您的项目正在从 Vue2 升级到 Vue3,只需要:
164
+
165
+ ### 步骤 1:更新引入路径
166
+
167
+ ```typescript
168
+ // 之前 (Vue2)
169
+ import { createMeetFunI18n } from 'meetfun-i18n/vue2'
170
+
171
+ // 之后 (Vue3)
172
+ import { createMeetFunI18n } from 'meetfun-i18n'
173
+ ```
174
+
175
+ ### 步骤 2:更新依赖
176
+
177
+ ```bash
178
+ # 卸载 Vue2 相关依赖
179
+ pnpm remove vue@2 vue-i18n@8
180
+
181
+ # 安装 Vue3 相关依赖
182
+ pnpm add vue@^3.0.0 vue-i18n@^9.0.0
183
+ ```
184
+
185
+ ### 步骤 3:更新 main 文件
186
+
187
+ ```typescript
188
+ // 之前 (Vue2)
189
+ import Vue from 'vue'
190
+ Vue.use(i18nInstance.getI18n())
191
+ Vue.prototype.$i18nInstance = i18nInstance
192
+
193
+ // 之后 (Vue3)
194
+ import { createSSRApp } from 'vue'
195
+ const app = createSSRApp(App)
196
+ app.use(i18nInstance.getI18n())
197
+ app.config.globalProperties.$i18nInstance = i18nInstance
198
+ ```
199
+
200
+ ### 步骤 4:更新组件语法
201
+
202
+ ```vue
203
+ <!-- 之前 (Vue2 Options API) -->
204
+ <script>
205
+ export default {
206
+ data() {
207
+ return {
208
+ text: this.$i18nInstance.$t('hello')
209
+ }
210
+ }
211
+ }
212
+ </script>
213
+
214
+ <!-- 之后 (Vue3 Composition API) -->
215
+ <script setup lang="ts">
216
+ import { ref } from 'vue'
217
+ import i18nInstance from '@/locales'
218
+
219
+ const text = ref(i18nInstance.$t('hello'))
220
+ </script>
221
+ ```
222
+
223
+ ## 注意事项
224
+
225
+ 1. **引入路径**:这是唯一的区别,Vue2 必须从 `meetfun-i18n/vue2` 引入
226
+ 2. **API 使用**:所有 API 方法在两个版本中完全相同
227
+ 3. **类型支持**:两个版本都提供完整的 TypeScript 类型定义
228
+ 4. **功能特性**:所有功能特性在两个版本中保持一致
229
+
230
+ ## 常见问题
231
+
232
+ ### Q: 可以在同一个项目中同时使用 Vue2 和 Vue3 版本吗?
233
+
234
+ A: 不可以。一个项目只能使用一个版本。请根据项目使用的 Vue 版本选择对应的引入路径。
235
+
236
+ ### Q: 如果引入错误的版本会怎样?
237
+
238
+ A: 会出现类型错误或运行时错误。Vue3 项目使用 `/vue2` 路径会导致 vue-i18n 版本不匹配。
239
+
240
+ ### Q: 两个版本的性能有差异吗?
241
+
242
+ A: 性能主要取决于 Vue 和 vue-i18n 的版本,本库在两个版本中的性能表现一致。
243
+
244
+ ### Q: API 函数的实现需要改变吗?
245
+
246
+ A: 不需要。API 函数的实现在两个版本中完全相同。
247
+
248
+ ## 相关文档
249
+
250
+ - [README.md](./README.md) - 完整的使用文档
251
+ - [VUE2_USAGE.md](./VUE2_USAGE.md) - Vue2 详细使用指南
252
+ - [USAGE_EXAMPLE.md](./USAGE_EXAMPLE.md) - 更多使用示例
253
+