11

我正在尝试在 nrwl-nx monorepo 中设置共享样式和资产(即字体)以用于库和应用程序。

我想要的结果是有一个图书馆“主题”,提供

  1. 共享样式
  2. scss 变量和 mixins
  3. 字体

对于其他库和应用程序。

对于 1. 和 2. 我在这里找到了一个很好的答案:How to manage SCSS stylesheets across a monorepo with different libraries sharing variables?

Tim Consolazio 提出了一种很好的(并且受 Nrwl 启发)方法来处理跨 monorepo 的共享样式。基本思想是有一个入口点 scss inlibs/theme/scss/src/lib/theme.scss被导入apps/myapp/src/styles.scss. 这工作正常。

我遇到的困难是让它与提供要在共享样式中使用的字体一起工作,即我有一个libs/theme/scss/src/lib/fonts.scss从主题库中的资产文件夹中导入字体的工具。

项目结构为

- apps
  - myapp
    - src
      - styles.scss (@import 'theme' from the lib)
- libs
  - theme
    - assets
      - src
        - lib
          - fonts
            - myfont.ttf
            ...
    - scss
      - src
        - lib
          - fonts.scss
          - theme.scss
          - variables.scss
          ...

目标是在themes库中拥有资产。我尝试添加到architect.build.assets数组中angular.json。但是在引用字体样式表中的字体时,我无法弄清楚要设置的正确路径:

@font-face {
  font-family: 'My-Font';
  src: url('./assets/fonts/myfont.eot');
  src: url('./assets/fonts/myfont.eot?#iefix') format('embedded-opentype'),
    url('./assets/fonts/myfont.woff2') format('woff2'),
    url('./assets/fonts/myfont.woff') format('woff'),
    url('./assets/fonts/myfont.ttf') format('truetype');
}

我错过了什么?

4

1 回答 1

13

因此,在经历了很多头痛之后,我找到了一个相当简单的解决方案,正如这篇Medium 文章中所建议的那样,稍作调整以使其正常工作。

项目结构:

- libs
  - theme
    - assets
        - fonts
            - myfont.ttf
            ...

关键是将共享资产的 glob 添加到您的每个应用程序angular.json,例如

  • projects.my-project-1.architect.build.options.assets
  • projects.my-project-2.architect.build.options.assets
  • ...
{
    "glob": "**/*",
    "input": "libs/theme/assets/",
    "output": "/assets/"
}

请参阅https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/asset-configuration.md#project-assets

另外,我不得不将 scss 中字体文件的导入路径更改为绝对路径:

@font-face {
  font-family: 'My-Font';
  src: url('/assets/fonts/myfont.eot');
  src: url('/assets/fonts/myfont.eot?#iefix') format('embedded-opentype'),
    url('/assets/fonts/myfont.woff2') format('woff2'),
    url('/assets/fonts/myfont.woff') format('woff'),
    url('/assets/fonts/myfont.ttf') format('truetype');
}

对我有用,但我很乐意了解更优雅的解决方案 - 尤其是需要为每个新应用程序复制粘贴资产 glob 困扰着我。

于 2019-07-29T10:45:07.007 回答