71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
import type { Plugin } from 'vite';
|
||
|
||
function viteDayjsPlugin(): Plugin {
|
||
return {
|
||
name: 'vite-dayjs-plugin',
|
||
enforce: 'pre',
|
||
async resolveId(source, importer, options) {
|
||
// 1) 已经使用了 dayjs/esm 的不处理
|
||
if (source.startsWith('dayjs/esm')) return null;
|
||
|
||
// 2) 根入口:dayjs -> dayjs/esm
|
||
if (source === 'dayjs') {
|
||
return await this.resolve('dayjs/esm', importer, {
|
||
skipSelf: true,
|
||
...options,
|
||
});
|
||
}
|
||
|
||
// 3) 插件入口的多种写法
|
||
// - dayjs/plugin/xxx.js -> dayjs/esm/plugin/xxx/index.js
|
||
// - dayjs/plugin/xxx -> dayjs/esm/plugin/xxx
|
||
const pluginWithJs = source.match(/^dayjs\/plugin\/([^/]+)\.js$/);
|
||
if (pluginWithJs) {
|
||
const target = `dayjs/esm/plugin/${pluginWithJs[1]}/index.js`;
|
||
return await this.resolve(target, importer, {
|
||
skipSelf: true,
|
||
...options,
|
||
});
|
||
}
|
||
|
||
const pluginBare = source.match(/^dayjs\/plugin\/([^/]+)$/);
|
||
if (pluginBare) {
|
||
const target = `dayjs/esm/plugin/${pluginBare[1]}`;
|
||
return await this.resolve(target, importer, {
|
||
skipSelf: true,
|
||
...options,
|
||
});
|
||
}
|
||
|
||
// 4) 处理多语言包
|
||
// - dayjs/locale/xxx.js -> dayjs/esm/locale/xxx.js
|
||
const localeWithJs = source.match(/^dayjs\/locale\/([^/]+)\.js$/);
|
||
if (localeWithJs) {
|
||
const target = `dayjs/esm/locale/${localeWithJs[1]}.js`;
|
||
return await this.resolve(target, importer, {
|
||
skipSelf: true,
|
||
...options,
|
||
});
|
||
}
|
||
const localeBare = source.match(/^dayjs\/locale\/([^/]+)$/);
|
||
if (localeBare) {
|
||
const target = `dayjs/esm/locale/${localeBare[1]}`;
|
||
return await this.resolve(target, importer, {
|
||
skipSelf: true,
|
||
...options,
|
||
});
|
||
}
|
||
|
||
return null;
|
||
},
|
||
config() {
|
||
return {
|
||
optimizeDeps: {
|
||
exclude: ['dayjs'],
|
||
},
|
||
};
|
||
},
|
||
};
|
||
}
|
||
export { viteDayjsPlugin };
|