Vue CLI 3でカスタムローカルフォントを読み込もうとすると、フォントがまだ表示されません。エラーメッセージは表示されません。インスペクターは正しいルールが読み込まれていることを示していますが、フォントは#appのserif
フォントがdistフォルダのどこにも表示されません。
Vue.config.jsにローダーを追加し、URLパスを変更し、@ font-faceルールを別の場所に移動し、パブリックパスを ''および '/'に変更して、scssをmain.jsにインポートしました。
フォントの読み込み:
@font-face {
font-family: 'OpenSans-Regular';
src: url('/assets/fonts/OpenSans-Regular.eot');
src: url('/assets/fonts/OpenSans-Regular.eot?#iefix') format('embedded-opentype'),
url('/assets/fonts/OpenSans-Regular.otf') format('font-opentype'),
url('/assets/fonts/OpenSans-Regular.woff') format('font-woff'),
url('/assets/fonts/OpenSans-Regular.ttf') format('font-truetype'),
url('/assets/fonts/OpenSans-Regular.svg#OpenSans-Regular') format('svg');
font-weight: normal;
font-style: normal;
}
そしてApp.vue内で使用します:
<style lang="scss">
#app {
font-family: 'OpenSans-Regular', serif;
}
</style>
そのスタイルは私のmain.scss
ファイル内に配置されます。次のようなファイル構造:
src
assets
fonts
OpenSans-Regular.eot
OpenSans-Regular.woff
etc
styles
main.scss
App.vue
vue.config.js
vue.config.js
ファイルは次のとおりです。
module.exports = {
publicPath: '/',
css: {
sourceMap: true,
loaderOptions: {
sass: {
data: `@import "@/styles/main.scss";`
}
}
},
configureWebpack: {
module: {
rules: [{
test: /\.(ttf|otf|eot|woff|woff2)$/,
use: {
loader: "file-loader",
options: {
name: "fonts/[name].[ext]",
},
},
}]
}
}
}
私もvue.config.js
でchainWebpackを試しましたが、役に立ちませんでした:
chainWebpack: config => {
config
.module
.rule("file")
.test(/\.(woff2?|eot|ttf|otf)(\?.*)?$/,)
.use("url-loader")
.loader("url-loader")
.options({
limit: 10000,
name: 'assets/fonts/[name].[ext]'
})
.end();
}
結局、ファイルローダーメソッドに移動して、フォントをパッケージ化し、パブリックパスを設定しました。
vue.config.js
module.exports = {
assetsDir: 'assets/',
publicPath: '/', // Base directory for dev
css: {
sourceMap: true,
loaderOptions: {
sass: {
data: `@import "@/styles/main.scss";`
}
}
},
chainWebpack: config => {
config.module
.rule("fonts")
.test(/\.(ttf|otf|eot|woff|woff2)$/)
.use("file-loader")
.loader("file-loader")
.tap(options => {
options = {
// limit: 10000,
name: '/assets/fonts/[name].[ext]',
}
return options
})
.end()
}
};
ファイルローダーはjsで呼び出されない限りファイルを表示しないため、main.js
にインポートしました。コンソールログは、未使用のインポートにフラグを付けるリンターをナビゲートするためのものです
// Fonts need to be called in js for webpack to see and copy over
import OpenSansReg from './assets/fonts/OpenSans-Regular.ttf';
import OpenSansLight from './assets/fonts/OpenSans-Light.ttf';
import OpenSansBold from './assets/fonts/OpenSans-Bold.ttf';
console.log(OpenSansReg, OpenSansBold, OpenSansLight);
それから私のscssファイルの1つに
@font-face {
font-family: 'OpenSans-Regular';
src: url('/assets/fonts/OpenSans-Regular.eot?#iefix') format('embedded-opentype'),
url('/assets/fonts/OpenSans-Regular.otf') format('opentype'),
url('/assets/fonts/OpenSans-Regular.woff') format('woff'),
url('/assets/fonts/OpenSans-Regular.ttf') format('truetype'),
url('/assets/fonts/OpenSans-Regular.svg#OpenSans-Regular') format('svg');
font-weight: normal;
font-style: normal;
}
カスタムフォントインポートもある最初のindex.htmlページのヘッドタグにカスタムアイコンフォントを貼り付けました。貼り付けるのと同じページ<div id="vue-app"></div>
。他のすべてのページ/コンポーネントは、font-familyを使用できます。
<head> ... <link rel="stylesheet" href="icon-font/styles.css" /> </head>
しかし、プロジェクトの他の場所を試すと失敗します。そしてScssはコンパイルさえしません。
私にとっては、「format()」というものを取り出して動作しました...最後に..