From 6b7740b74291a1328576925ab753ad2939334cc8 Mon Sep 17 00:00:00 2001 From: neverland Date: Mon, 11 Dec 2017 15:38:01 +0800 Subject: [PATCH] [Improvement] Support local font file (#408) --- docs/markdown/en-US/icon.md | 7 +++ docs/markdown/zh-CN/icon.md | 8 +++ docs/src/examples.js | 1 + packages/vant-css/gulpfile.js | 56 +++++++++++++----- .../vant-css/scripts/icon-local-template.js | 8 +++ packages/vant-css/src/icon-local.css | 6 ++ packages/vant-css/src/icon.css | 2 +- packages/vant-css/src/vant-icon-82e489.ttf | Bin 0 -> 25804 bytes 8 files changed, 71 insertions(+), 17 deletions(-) create mode 100644 packages/vant-css/scripts/icon-local-template.js create mode 100644 packages/vant-css/src/icon-local.css create mode 100644 packages/vant-css/src/vant-icon-82e489.ttf diff --git a/docs/markdown/en-US/icon.md b/docs/markdown/en-US/icon.md index ab24205fe..f6b924209 100644 --- a/docs/markdown/en-US/icon.md +++ b/docs/markdown/en-US/icon.md @@ -16,6 +16,13 @@ View all usable icons on the right. ``` +#### Use local font file +Icon uses font file in `yzcdn.cn` by default,if you want to use the local font file,please import the following css file. + +```js +import 'vant/lib/vant-css/icon-local.css'; +``` + ### API | Attribute | Description | Type | Default | Accepted Values | diff --git a/docs/markdown/zh-CN/icon.md b/docs/markdown/zh-CN/icon.md index b92eb7a05..605693581 100644 --- a/docs/markdown/zh-CN/icon.md +++ b/docs/markdown/zh-CN/icon.md @@ -16,6 +16,14 @@ Vue.component(Icon.name, Icon); ``` +#### 使用本地字体文件 +Icon 组件默认引用 `yzcdn.cn` 域名下的字体文件,如果想要使用本地字体文件,请引入下面的 css 文件 + +```js +import 'vant/lib/vant-css/icon-local.css'; +``` + + ### API | 参数 | 说明 | 类型 | 默认值 | 可选值 | diff --git a/docs/src/examples.js b/docs/src/examples.js index ca9198cac..370d7e120 100644 --- a/docs/src/examples.js +++ b/docs/src/examples.js @@ -5,6 +5,7 @@ import routes from './router.config'; import Vant, { Lazyload } from 'packages'; import VantDoc from 'vant-doc'; import 'packages/vant-css/src/index.css'; +import 'packages/vant-css/src/icon-local.css'; import 'vant-doc/src/helper/touch-simulator'; Vue.use(Vant); diff --git a/packages/vant-css/gulpfile.js b/packages/vant-css/gulpfile.js index 842778f1d..22f62d6da 100644 --- a/packages/vant-css/gulpfile.js +++ b/packages/vant-css/gulpfile.js @@ -8,7 +8,27 @@ const config = require('./scripts/icon-config'); const path = require('path'); const shelljs = require('shelljs'); const md5File = require('md5-file'); +const glob = require('glob'); +const iconLocalTemplate = require('./scripts/icon-local-template'); +const resolve = relativePath => path.resolve(__dirname, relativePath); +// compile component css +gulp.task('compile', () => { + return gulp + .src('./src/*.css') + .pipe(postcss()) + .pipe(cssmin()) + .pipe(gulp.dest('./lib')); +}); + +// copy lib files +gulp.task('lib', ['compile'], () => { + const ttf = glob.sync(resolve('./src/*.ttf')); + ttf.forEach(ttf => fs.copy(ttf, './lib/' + path.parse(ttf).base)); + fs.copy('./lib', '../../lib/vant-css'); +}); + +// extract svg from sketch function extractSvg() { shelljs.exec('./scripts/extract-icons.sh'); fs.mkdirsSync(path.join(__dirname, './icons')); @@ -20,6 +40,7 @@ function extractSvg() { }); } +// get icon unicode function getCodePoints() { const codePoints = {}; config.glyphs.forEach((icon, index) => { @@ -30,15 +51,7 @@ function getCodePoints() { }); } -gulp.task('compile', () => { - return gulp - .src('./src/*.css') - .pipe(postcss()) - .pipe(cssmin()) - .pipe(gulp.dest('./lib')) - .pipe(gulp.dest('../../lib/vant-css/')); -}); - +// generate ttf from sketch && build icon.css gulp.task('icon-font-ttf', () => { extractSvg(); return gulp @@ -64,15 +77,26 @@ gulp.task('icon-font-ttf', () => { }); gulp.task('icon-font', ['icon-font-ttf'], () => { - const fontPath = path.resolve(__dirname, './icons/vant-icon.ttf'); - const hash = md5File.sync(fontPath).slice(0, 8); - fs.renameSync(fontPath, path.resolve(__dirname, `./icons/vant-icon-${hash}.ttf`)); + // remove previous ttf + const prevTTFs = glob.sync(resolve('./src/*.ttf')); + prevTTFs.forEach(ttf => fs.removeSync(ttf)); - let source = fs.readFileSync(path.resolve(__dirname, './icons/icon.css'), 'utf-8'); + // generate ttf hash + const fontPath = resolve('./icons/vant-icon.ttf'); + const hash = md5File.sync(fontPath).slice(0, 6); + fs.renameSync(fontPath, resolve(`./src/vant-icon-${hash}.ttf`)); + + // copy icon.css to src + let source = fs.readFileSync(resolve('./icons/icon.css'), 'utf-8'); source = source.replace('vant-icon.ttf', `vant-icon-${hash}.ttf`); + fs.writeFileSync(resolve('./src/icon.css'), source); - fs.writeFileSync(path.resolve(__dirname, './src/icon.css'), source); - shelljs.exec(`superman cdn /zanui/icon ./icons/vant-icon-${hash}.ttf`); + // generate icon-local.css + const localIconSource = iconLocalTemplate(config.name, hash); + fs.writeFileSync(resolve('./src/icon-local.css'), localIconSource); + + // upload ttf to cdn + shelljs.exec(`superman cdn /zanui/icon ./src/vant-icon-${hash}.ttf`); }); -gulp.task('build', ['compile']); +gulp.task('build', ['lib']); diff --git a/packages/vant-css/scripts/icon-local-template.js b/packages/vant-css/scripts/icon-local-template.js new file mode 100644 index 000000000..83c9098ab --- /dev/null +++ b/packages/vant-css/scripts/icon-local-template.js @@ -0,0 +1,8 @@ +module.exports = (fontName, hash) => { + return `@font-face { + font-style: normal; + font-weight: normal; + font-family: '${fontName}'; + src: url('./${fontName}-${hash}.ttf') format('truetype'); +}`; +}; diff --git a/packages/vant-css/src/icon-local.css b/packages/vant-css/src/icon-local.css new file mode 100644 index 000000000..3493fc4eb --- /dev/null +++ b/packages/vant-css/src/icon-local.css @@ -0,0 +1,6 @@ +@font-face { + font-style: normal; + font-weight: normal; + font-family: 'vant-icon'; + src: url('./vant-icon-82e489.ttf') format('truetype'); +} \ No newline at end of file diff --git a/packages/vant-css/src/icon.css b/packages/vant-css/src/icon.css index 461056e6f..37f7a3345 100644 --- a/packages/vant-css/src/icon.css +++ b/packages/vant-css/src/icon.css @@ -2,7 +2,7 @@ font-style: normal; font-weight: normal; font-family: 'vant-icon'; - src: url('https://b.yzcdn.cn/zanui/icon/vant-icon-b95631de.ttf') format('truetype'); + src: url('https://b.yzcdn.cn/zanui/icon/vant-icon-82e489.ttf') format('truetype'); } .van-icon { diff --git a/packages/vant-css/src/vant-icon-82e489.ttf b/packages/vant-css/src/vant-icon-82e489.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cc086e2c7546de52384e227ec324887b157f862e GIT binary patch literal 25804 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