十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何用 Faker 构造自定义 locale 与多级 locale 回退实例

如何用 Faker 构造自定义 locale 与多级 locale 回退实例 如何用 Faker 构造自定义 locale 与多级 locale 回退实例【免费下载链接】fakerGenerate massive amounts of fake data in the browser and node.js项目地址: https://gitcode.com/GitHub_Trending/faker/fakerFaker 在 Node.js 和浏览器中生成测试用的假数据人名、地址、邮编、邮箱等。官方默认导出的faker实例使用英语数据各语言有预构建实例如fakerDE。但当你需要两种官方实例都给不了的东西——比如「用某语言数据打底再用自己维护的一组数据覆盖个别条目」或者「缺数据时不退回英语而退回另一个自定义 locale」——就需要自己构造Faker实例把多个 locale 排成一条回退链传给构造函数。本文基于仓库的 Localization 指南 和 README演示这条构造路径以及如何验证回退行为符合预期。准备条件Faker 通过 npm 安装README 给出的安装命令npm install --save-dev faker-js/faker如果项目使用 TypeScriptUsage 指南 要求tsconfig的moduleResolution设为BundlerESM 场景也允许Node10/Node16/Node20/NodeNextCJS 场景允许Node20/NodeNextstrict建议开启但非强制。构造自定义实例不需要修改仓库或额外配置全部工作在应用代码里完成。多级回退locale数组的工作方式用Faker构造函数时locale参数可以传一个LocaleDefinition数组。locale中每一级的含义来自 src/faker.ts 的构造器文档和 Localization 指南数组按顺序检查第一个包含所请求数据的 locale 被采用前面的条目覆盖后面的条目指南称前一项会 override all other fallback definitions注意所有用到的 locale 及其父级 locale 都要出现在数组里例如[de_AT, de, en, base]见Faker构造器的 JSDoc。指南给出的完整示例文档示例import type { LocaleDefinition } from faker-js/faker; import { base, de, de_CH, en, Faker } from faker-js/faker; const customLocale: LocaleDefinition { title: My custom locale, internet: { domainSuffix: [test], }, }; export const customFaker new Faker({ locale: [customLocale, de_CH, de, en, base], });这条链有 5 级指南对每一级的说明是级别作用customLocale自定义 locale 定义覆盖其他所有回退定义de_CH德国瑞士数据覆盖部分德语通用数据de德语通用 localeen英语是最完整的 locale用于填补空档指南提示是否要把它放进回退链取决于你的需求base基础 locale包含所有语言通用的定义如 emoji如果不需要自定义覆盖只想要「特定地区 通用语言」两级回退README 里给出的最短写法import { de, de_CH, Faker } from faker-js/faker; export const faker new Faker({ locale: [de_CH, de], });另外FakerOptions见 src/core.ts还支持randomizer和seed两个选项前者用于共享同一随机源后者用于生成可复现的值默认是 Mersenne Twister 随机数生成器与随机种子。只关心 locale 时不传即可。只保留必要 locale减少体积与回退面回退链不是越长越好。src/faker.ts 的 JSDoc 示例说明只用单一 locale 可以减小打包体积smaller bundle size但代价是缺失的数据会直接抛错import { Faker, es } from faker-js/faker; // create a Faker instance with only es data and no en fallback ( smaller bundle size) const customFaker new Faker({ locale: [es] }); customFaker.person.firstName(); // Javier customFaker.person.lastName(); // Ocampo Corrales customFaker.music.genre(); // throws Error as this data is not available in es注意这里的输出值是文档示例不同种子下人名会不同固定部分是行为es缺少music数据时customFaker.music.genre()会抛出 Error而不是静默回退到英语。这正是与预构建实例的关键差异——README 说明预构建实例如fakerDE在数据缺失时会回退到英语若你不想要这种行为就应该自己构造实例。验证回退行为构造完实例后用 Usage 指南 的 Node.js 方式跑一段代码验证。下面两段均来自文档输出值视为文档示例验证缺失数据会回退而不是报错指南 Handling Missing Data Errors 一节import { Faker, base, el, en } from faker-js/faker; const faker new Faker({ locale: [el, en, base], }); console.log(faker.location.country()); // Belgiumel希腊语本身没有location.country数据这里取到了英语的值说明第二级回退生效。验证自定义 locale 确实排在回退链最前指南 Handling Not-Applicable Data Errors 一节import { Faker, en, en_HK } from faker-js/faker; const faker new Faker({ locale: [{ location: { postcode: en.location.postcode } }, en_HK], }); console.log(faker.location.zipCode()); // 17551-0348验证元数据Faker实例提供getMetadata()方法src/faker.ts 文档示例import { faker, fakerES_MX } from faker-js/faker; faker.getMetadata(); // { title: English, code: en, language: en, endonym: English, dir: ltr, script: Latn } fakerES_MX.getMetadata(); // { title: Spanish (Mexico), code: es_MX, language: es, endonym: Español (México), dir: ltr, script: Latn, country: MX }此外实例的rawDefinitionsgetter 返回合并后的 locale 原始定义src/faker.ts可用于在调试时检查某条数据最终落在哪个来源。回退链的一个硬限制null不会继续回退这是构造多级回退时最容易踩的坑指南有明确的警告某些 locale 对某些方法显式不提供数据对应条目被设为null例如en_HK没有zipCode数据因为香港没有邮编。直接调用会报错import { fakerEN_HK } from faker-js/faker; console.log(fakerEN_HK.location.zipCode()); // Errornull被视为「存在的数据」不会触发回退。因此把补丁放在en_HK之后是无效的import { Faker, en, en_HK } from faker-js/faker; const faker new Faker({ locale: [en_HK, { location: { postcode: en.location.postcode } }], // 无效写法 }); console.log(faker.location.zipCode()); // Error正确做法是把带补丁的自定义 locale 放在en_HK前面即上一节验证用的那条链让补丁在检查null之前就命中。构造自定义 locale 时的类型约定自定义 locale 对象的结构由LocaleDefinition类型约束src/definitions/definitions.ts一级属性对应各数据类别person、location、internet、music……全部可选每个类别内的条目可选或为null并允许附加自定义条目Recordstring, unknown。也就是说你可以只写需要覆盖的条目例如上面的internet.domainSuffix: [test]其余条目自然落回后面的 locale。LocaleDefinition从faker-js/faker包根导出src/index.ts可直接import type。排查两类报错指南列出了与 locale 直接相关的两种错误文本可用于判断当前实例缺什么Missing dataThe locale data for category.entry are missing in this locale.—— 当前实例的所有回退级别都没有该数据。解法二选一给实例加回退 locale或为项目贡献缺失数据。Not applicableThe locale data for category.entry arent applicable to this locale.—— 当前 locale 无法为该方法提供合理值对应上文的null情况。解法是在回退链前面加一个带自定义数据的 locale而不是依赖后面的回退。另外src/definitions/metadata.ts 定义了元数据字段title、code、language、endonym、dir、script国家级 locale 还有country。如果你的自定义 locale 想提供metadata可按这些字段填充。可选枚举与手动合并 locale需要按 locale 代码动态取实例或原始定义时包根导出了allFakers与allLocales两个对象以 locale 代码为键指南示例import { allFakers, allLocales } from faker-js/faker; console.dir(allFakers[de_AT]); // the prebuilt Faker instance for de_AT console.dir(allLocales[de_AT]); // the raw locale definitions for de_AT指南还给出了遍历allFakers为每个 locale 打样名的完整循环含try/catch因为部分 locale 对某些方法会抛错。不想用Faker构造函数、只想手动合并多级定义时可以用mergeLocalessrc/utils/merge-locales.ts其 JSDoc 说明按给定顺序合并每个类别采用第一个提供该类别条目的 locale。注意文档同时指出对合并结果中某个类别条目的修改会同时修改对应源 locale 的条目。import { de_CH, de, en, mergeLocales } from faker-js/faker; const de_CH_with_fallbacks mergeLocales([de_CH, de, en]);完整可用 locale 清单70 个含代码命名规则说明见 Localization 指南的 Available locales 一节。【免费下载链接】fakerGenerate massive amounts of fake data in the browser and node.js项目地址: https://gitcode.com/GitHub_Trending/faker/faker创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表