A webpack loader for FormatJS, precompiles ICU MessageFormat strings, improve performance by avoiding runtime parsing of ICU messages.
- Through Webpack loader precompile ICU MessageFormat strings
- Integrates seamlessly with webpack build process.
npm install --save-dev @nice-labs/formatjs-webpack-loaderAdd the loader to your webpack configuration:
import * as path from 'node:path'
import type { Configuration } from 'webpack'
export default {
// ...
resolve: {
// See <https://formatjs.github.io/docs/guides/advanced-usage>
alias: {
'@formatjs/icu-messageformat-parser': '@formatjs/icu-messageformat-parser/no-parser',
},
},
// ...
module: {
rules: [
// ...
{
test: /\.json$/,
loader: require.resolve('@nice-labs/formatjs-webpack-loader'),
options: {
// Loader options here
},
include: [
// Specify the directories or files to include
path.resolve(__dirname, 'src', 'locales'),
],
},
// ...
],
},
// ...
} satisfies Configurationin the above example, the loader is applied to all .json files in the src/locales directory.
in your source code, you can import the messages like this:
import messages from './locales/en-US.json'
// stored file format: Record<string, MessageDescriptor>
// used file format: Record<string, MessageFormatElement[]>Precompiled files do not need to be stored or tracked in codebase, this webpack loader will handle it for you
The format of the input. It can be one of the following:
The pseudo locale to use for the input. It can be one of the following:
xx-LS: Append'S' * 25at the end to simulate long stringxx-AC:toUpperCaseeverythingxx-HA: Prefix[javascript]to the messageen-XA: Convert letter to hebrew letteren-XB: Convert letter to accented letter
See formatjs/formatjs#2165 (comment)
Whether to treat HTML/XML tags as string literal instead of parsing them as tag token. When this is false we only allow simple tags without any attributes
Should select, selectordinal, and plural arguments always include the other case clause.
Whether to parse number/datetime skeleton into Intl.NumberFormatOptions and Intl.DateTimeFormatOptions, respectively.
for example:
import messages from './locales/en-US.json?pseudo-locale=xx-LS'
// pseudo locale will be applied to the messages