nuxt-font-loader-strategy
Version:
Helps to load fonts and activate them by preloading.
55 lines (48 loc) • 1.45 kB
JavaScript
import { resolve } from 'path'
import { arrayFlat } from '../utils/index'
export function addWebWorker (moduleScope, fonts, options) {
const preparedFonts = prepareFonts(fonts)
const workerData = prepareJSON(preparedFonts)
moduleScope.extendBuild((config) => {
config.module.rules.push({
test: /\.font.worker\.js$/,
use: {
loader: 'worker-loader',
options: {
inline: true,
fallback: true
}
}
})
})
moduleScope.addTemplate({
src: resolve(__dirname, 'preload.font.worker.js'),
fileName: 'nuxt-font-loader-strategy/worker/preload.font.worker.js',
options: Object.assign({}, options, {
})
})
moduleScope.addPlugin({
src: resolve(__dirname, 'plugin.js'),
fileName: 'nuxt-font-loader-strategy/worker/plugin.js',
options: Object.assign({}, options, {
publicPath: moduleScope.nuxt.options.build.publicPath,
workerData
}),
ssr: false
})
}
function prepareJSON (preparedFonts) {
return preparedFonts.sources.reduce((result, source) => {
result = result.replace(`"${source}"`, `require('${source}')`)
return result
}, JSON.stringify(preparedFonts))
}
function prepareFonts (fonts) {
return fonts.filter(font => !font.preload).reduce((result, { sources }) => {
result.sources.push(sources[0].path)
return result
}, {
classes: arrayFlat(fonts.map(font => font.classes)),
sources: []
})
}