You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 13升级至14时库编译报错:无法读取项目根目录外资源

解决Angular 14库项目引用node_modules图片资源报错问题

问题背景

Angular库项目依赖存放在node_modules中的图片npm库,SCSS通过background-image: url('img/sprites.png')引用图片。从Angular 10升级到14后,出现图片无法读取警告,最终复制资源阶段报错:Cannot read assets from a location outside of the project root.,且无法通过angular.json配置assets或stylePreprocessorOptions。

可行解决方案

1. 在SCSS路径前添加~符号

Angular的SCSS预处理器支持用~指向node_modules目录,修正引用路径为:

css-class{
  background-image: url('~second-lib/img/sprites.png');
}

这个写法会让预处理器直接从node_modules/second-lib下查找图片,绕过项目根目录的资源检查限制。

2. 通过ng-package.json配置资源复制

Angular库项目使用ng-packagr打包,可在项目根目录的ng-package.json中添加资源复制规则,将node_modules中的图片复制到库的输出目录:

{
  "$schema": "./node_modules/ng-packagr/ng-package.schema.json",
  "lib": {
    "entryFile": "src/public-api.ts"
  },
  "assets": [
    {
      "glob": "**/*.png",
      "input": "../node_modules/second-lib/img",
      "output": "./img"
    }
  ]
}

配置后,打包时会自动将目标图片复制到库的img目录下,原SCSS中的url('img/sprites.png')即可正常引用。

3. 将图片转为Base64嵌入SCSS

如果上述方法都不适用,可以将图片转为Base64编码,直接嵌入SCSS中,避免资源复制步骤:

css-class{
  background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...');
}

可以用在线工具或本地脚本批量转换图片为Base64,这种方式无需依赖外部资源文件,彻底解决跨目录读取问题。

4. 调整依赖图片库的打包方式

如果有权限修改图片npm库的代码,可以调整其打包配置:

  • 在库的package.json中添加style字段,指向包含图片路径变量的SCSS文件
  • 在SCSS文件中导出路径变量,比如:$sprites-path: '~second-lib/img/sprites.png';
  • 主项目中引入该变量后使用:background-image: url(#{$sprites-path});

内容的提问来源于stack exchange,提问作者user26436857

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:53:25