Angular Web 组件捆绑外部自定义字体包

标签 angular web-component custom-font

我已经使用 Angular 8 的自定义元素创建了一个 Web 组件。该组件的一部分是显示一些自定义图标(开发并打包为不同的应用程序)。我已经在 package.json 中包含了自定义图标的包。组件文件:

"dependencies": {
     "@somelibrary/icons": "1.0.34"
}

我正确安装在节点模块中。在 angular.json文件我在样式中包含 css 文件:
"styles": [
    "src/styles.css",
    "node_modules/@somelibrary/icons/css/fontface.css"
],
fontface.css file 使用 font-face 指定自定义字体文件的 url:
@font-face {
  font-family: "my-fonts";
  src:url('../fonts/my-fonts.woff2') format('woff2'),
    url('../fonts/my-fonts.woff') format('woff'),
    url('../fonts/my-fonts.ttf') format('truetype');
  font-weight: normal;
  font-style: normal;
}

然后,我构建了自定义 Web 组件并将所有创建的 js 文件连接成一个,用作独立组件。
cat dist/lib/runtime.js dist/lib/polyfills.js dist/lib/scripts.js dist/lib/main.js > dist/myComponent.js

这里的问题是,当我使用最终生成的 javascript 文件(将其包含在一个简单的 index.html 页面中)时,不包含 tff 和 woff 文件,所以我最终只看到了图标的占位符。

我尝试在构建 myComponent.js 期间包含字体文件文件,但正如预期的那样,我得到了一个语法错误。
cat dist/lib/runtime.js dist/lib/polyfills.js dist/lib/scripts.js dist/lib/main.js dist/lib/my-fonts.ttf> dist/myComponent.js

我见过像 this 这样的答案但目标是一个可移植的组件,而且因为字体是外部的,我不能将它们移动到 Assets 文件夹,因为它们可能会随着时间而改变。

我还探索了 this 的选项线程,我无法将 Assets 外部化(因为它们来自一个包)并且用于 ttf 和 wof 文件的 url-loader 不起作用。

有没有人尝试过类似的东西?由单个 javascript 文件组成的 Web 组件如何包含在独立应用程序中显示的外部字体。

最佳答案

我终于设法解决了我的问题。

通过 package.json 在构建之前,我将 .woff 文件(包含图标)编码为 base64。然后新建一个fontface-copy.css其中 src url 包含 Data URI 中的所有数据,如下所示:

src:url(`data:application/octet-stream;base64,[encoded_output]`)

最后将新创建的文件包含在主 css 文件中,并在构建后将图标捆绑在 javascript 文件中。

请求后更新更多详细信息:

我处理它的方式是在package.json里面文件,在构建脚本中和之前 ng build我添加了一些额外的npm run将字体文件包含在捆绑的 js 中的命令。

第一步是使用以下命令将包含字体的 woff 文件编码为 base64
base64 my-fonts.woff > base64-fonts.txt 

下一步是添加字符串 data:application/octet-stream;base64,在编码文本的前面。这可以使用 sed 来完成。命令。

在应用程序中应该存在 .css链接到 .woff 的文件(带有字体)像这样的文件:
@font-face {
  font-family: "my-fonts";
  src:url('../fonts/my-fonts.woff') format('woff');
  font-weight: normal;
  font-style: normal;
}

最后一步是将 .css 文件中的 url 链接替换为 base64-fonts.txt 的内容。刚刚创建的文件(保留引号,也使用 sed)。新的 css 文件现在包含内联编码字体,一旦构建应用程序,字体应该包含在捆绑文件中。

package.json 文件的一个小例子:
"build": "npm run fonts-encode && npm run fonts-edit && npm run replace-css && ng build my-app --prod --output-hashing=none",
"fonts-encode": "base64 my-fonts.woff > base64-fonts.txt",
"fonts-edit": "[sed_command] base64-fonts.txt",
"replace-css": "[sed_command] base64-fonts.txt font-face.css"

关于Angular Web 组件捆绑外部自定义字体包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60059903/

相关文章:

angular - 如何在 Angular 6 的生产构建中忽略规范文件和模拟文件

javascript - Angular2 转义斜线管道

javascript - 如何访问嵌套 Web 组件的祖先?

angular - 找不到名称 'Office'

angular - 创建已弃用 : from v5 use the new signature Injector. create(options)(弃用)

javascript - 哪种 Angular 1.5 组件绑定(bind)类型更昂贵? '=' 还是 '<'?

javascript - webcomponent 中的子元素

android - Android PhoneGap 中的自定义字体

android - RuntimeException:未找到字体 Assets optimale_bold.ttf

android - 如何在android中的对话框中更改字体?