vite-plugin-font
Version:
An automatic Web Font optimization plugin that supports many platforms such as Vite, Next, Nuxt, and more.
115 lines (110 loc) • 3.67 kB
JavaScript
;
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
const unplugin = require('unplugin');
const SubsetBundlePlugin = require('./subset/SubsetBundlePlugin.js');
const normalizePath = require('./utils/normalizePath.js');
class UnionFontPlugin {
constructor() {
this.config = {};
this.pluginStore = /* @__PURE__ */ new Map();
}
async start() {
if (this.prepared) return this.prepared;
if (!this.config.cacheDir)
this.config.cacheDir = "node_modules/.cache/.font";
let resolve;
this.prepared = new Promise((res) => {
resolve = res;
});
if (this.config.emptyCacheDir === true) {
await SubsetBundlePlugin.SubsetUtils.emptyCacheDir(this.config);
console.log(
"vite-plugin-font | empty cache dir | " + this.config.cacheDir,
"\nemptyCacheDir: false to cancel this behavior."
);
await this.getUsingPlugin("default");
console.log(
"vite-plugin-font | cache dir | " + this.config.cacheDir
);
}
resolve(null);
}
createConfig(config) {
const scanFiles = typeof config.scanFiles === "object" && !(config.scanFiles instanceof Array) ? config.scanFiles : {
default: config.scanFiles
};
this.config = { ...config, scanFiles };
}
getCacheDir() {
return this.config.cacheDir ?? "node_modules/.cache/.font";
}
setCacheDir(cacheDir) {
this.config.cacheDir = cacheDir;
}
async getUsingPlugin(key) {
let usingPlugin = this.pluginStore.get(key);
if (!usingPlugin) {
usingPlugin = new SubsetBundlePlugin.SubsetBundlePlugin(this.config);
usingPlugin.key = key;
this.pluginStore.set(key, usingPlugin);
}
await usingPlugin.createSubsetsHash();
return usingPlugin;
}
/** 通过改动文件的 path 获取需要变更的 plugin */
getWatchingPlugin(path) {
let matchedPlugins = [];
this.pluginStore.forEach((plugin, key) => {
if (plugin.isMatchScanArea(path)) {
matchedPlugins.push(plugin);
}
});
return matchedPlugins;
}
}
const unpluginFactory = (config = {}) => {
const include = config.include ?? [/\.otf/, /\.ttf/];
const exclude = config.exclude ?? [/\/node_modules\//];
const plugin = new UnionFontPlugin();
plugin.createConfig(config);
return {
name: "vite-plugin-font",
loadInclude(id) {
id = normalizePath.normalizePath(id);
if (exclude.some((i) => i.test(id))) return false;
return include.some((i) => i.test(id));
},
enforce: "pre",
vite: {
async configResolved(c) {
plugin.setCacheDir(c.cacheDir);
await plugin.start();
},
/** 先对 vite 进行热更新支持 */
handleHotUpdate(ctx) {
const plugins = plugin.getWatchingPlugin(ctx.file);
return ctx.modules.concat(
plugins.map((i) => {
return ctx.server.moduleGraph.getModuleById(
i.buildId
);
})
);
}
},
async load(id) {
await plugin.start();
const { isSubset, searchParams } = SubsetBundlePlugin.SubsetUtils.isSubsetLink(id);
const key = searchParams.get("key") ?? "default";
const usingPlugin = await plugin.getUsingPlugin(key);
await usingPlugin.prebuild(id, isSubset ? "subsets" : "full");
usingPlugin.buildId = id;
return usingPlugin.createSourceCode(id);
}
};
};
const fontPlugin = /* @__PURE__ */ unplugin.createUnplugin(unpluginFactory);
exports.default = fontPlugin;
exports.fontPlugin = fontPlugin;
exports.unpluginFactory = unpluginFactory;
module.exports = fontPlugin;