Skip to content

从动态导入中删除未使用的语言。

如果动态导入语言环境,则 webpack 会将 date-fns 中的所有语言环境加载到一个包中 (约 160kb) 或拆分到多个块中。

这会延长构建过程并增加占用的空间量。

但是,可以使用 webpack 通过 ContextReplacementPlugin 精简语言。

我们假设我们有一个支持语言环境的点:

config.js 文件

js
// 查看 date-fns/src/locale 了解可用的语言环境
export const supportedLocales = ['en-US', 'de', 'pl', 'it'];

我们还可以有一个格式化日期的函数:

js
const getLocale = (locale) => import(`date-fns-locale/locale/${locale}.js`); // 如果使用 CommonJS 则用 require()  导入

const formatDate = (date, formatStyle, locale) => {
    return format(date, formatStyle, {
        locale: getLocale(locale).default
    });
};

为了排除未使用的语言,我们可以使用 webpack ContextReplacementPlugin 插件。

webpack.config.js 文件

js
import webpack from 'webpack';
import { supportedLocales } from './config.js';

export default config = {
    resolve: {
        alias: {
            'date-fns-locale': path.dirname(
                require.resolve('date-fns/package.json')
            )
        }
    },
    plugins: [
        new webpack.ContextReplacementPlugin(
            /date-fns[/\\]locale/,
            new RegExp(`(${locales.join('|')})\.js$`)
        )
    ]
};

这产生了一个 ~23kb 大小的语言包。

何以解忧,唯有代码。不忘初心,方得始终。