Angular项目导入@angular/material样式表失败求助
我是Angular新手,现在碰到样式表导入失败的问题,不管怎么操作都会报错:
Error: Module build failed (from ./node_modules/sass-loader/dist/cjs.js): SassError: Can't find stylesheet to import: @use '@angular/material' as mat;
我查了相关讨论帖,但所有解决方案都没用,已经折腾了一整天,试过ng update、调整angular.json配置这些操作,感觉漏掉了某个细微的关键点但就是找不着。以下是我的相关文件内容:
样式文件(styles.scss)
// Custom Theming for Angular Material // For more information: https://material.angular.io/guide/theming @use '@angular/material' as mat; // Plus imports for other components in your app. // Include the common styles for Angular Material. We include this here so that you only // have to load a single css file for Angular Material in your app. // Be sure that you only ever include this mixin once! @include mat.core(); // Define the palettes for your theme using the Material Design palettes available in palette.scss // (imported above). For each palette, you can optionally specify a default, lighter, and darker // hue. Available color palettes: https://material.io/design/color/ $theme-primary: mat.define-palette(mat.$indigo-palette); $theme-accent: mat.define-palette(mat.$pink-palette, A200, A100, A400); // The warn palette is optional (defaults to red). $theme-warn: mat.define-palette(mat.$red-palette); // Create the theme object. A theme consists of configurations for individual // theming systems such as "color" or "typography". $theme: mat.define-light-theme(( color: ( primary: $theme-primary, accent: $theme-accent, warn: $theme-warn, ), typography: mat.define-typography-config(), )); // Include theme styles for core and each component used in your app. // Alternatively, you can import and @include the theme mixins for each component // that you are using. @include mat.all-component-themes($theme);
angular.json文件
{ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "movieSearch": { "projectType": "application", "schematics": { "@schematics/angular:component": { "style": "scss" }, "@schematics/angular:application": { "strict": true } }, "root": "", "sourceRoot": "src", "prefix": "app", "architect": { "build": { "builder": "@angular-devkit/build-angular:browser", "options": { "progress": false, "outputPath": "dist", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.app.json", "inlineStyleLanguage": "scss", "aot": true, "assets": [ "src/assets" ], "styles": [ "node_modules/bootstrap/dist/css/bootstrap.min.css", "src/styles.scss" ], "stylePreprocessorOptions": { "includePaths": [ "node_modules/" ] }, "scripts": [] }, "configurations": { "production": { "optimization": true, "outputHashing": "all", "sourceMap": false, "extractCss": true, "namedChunks": false, "extractLicenses": true, "vendorChunk": false, "buildOptimizer": true, "budgets": [ { "type": "initial", "maximumWarning": "500kb", "maximumError": "1mb" }, { "type": "anyComponentStyle", "maximumWarning": "2kb", "maximumError": "4kb" } ], "fileReplacements": [ { "replace": "src/environments/environment.ts", "with": "src/environments/environment.prod.ts" } ] }, "development": { "buildOptimizer": false, "optimization": false, "vendorChunk": true, "extractLicenses": false, "sourceMap": true, "namedChunks": true } }, "defaultConfiguration": "production" }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", "configurations": { "production": { "browserTarget": "movieSearch:build:production" }, "development": { "browserTarget": "movieSearch:build:development", "proxyConfig": "proxy.conf.js" } }, "defaultConfiguration": "development" }, "extract-i18n": { "builder": "@angular-devkit/build-angular:extract-i18n", "options": { "browserTarget": "movieSearch:build" } }, "test": { "builder": "@angular-devkit/build-angular:karma", "options": { "main": "src/test.ts", "polyfills": "src/polyfills.ts", "tsConfig": "tsconfig.spec.json", "karmaConfig": "karma.conf.js", "assets": [ "src/assets" ], "styles": [ "src/styles.scss" ], "scripts": [] } }, "server": { "builder": "@angular-devkit/build-angular:server", "options": { "outputPath": "dist-server", "main": "src/main.ts", "tsConfig": "tsconfig.server.json" }, "configurations": { "dev": { "optimization": true, "outputHashing": "all", "sourceMap": false, "namedChunks": false, "extractLicenses": true, "vendorChunk": true }, "production": { "optimization": true, "outputHashing": "all", "sourceMap": false, "namedChunks": false, "extractLicenses": true, "vendorChunk": false } } } } } }, "defaultProject": "movieSearch", "cli": { "analytics": false } }
package.json文件
{ "name": "moviesearch", "version": "0.0.0", "scripts": { "ng": "ng", "prestart": "node aspnetcore-https", "start": "run-script-os", "start:windows": "ng serve --port 44400 --ssl --ssl-cert %APPDATA%\ASP.NET\https\%npm_package_name%.pem --ssl-key %APPDATA%\ASP.NET\https\%npm_package_name%.key", "start:default": "ng serve --port 44400 --ssl --ssl-cert $HOME/.aspnet/https/${npm_package_name}.pem --ssl-key $HOME/.aspnet/https/${npm_package_name}.key", "build": "ng build", "build:ssr": "ng run movieSearch:server:dev", "watch": "ng build --watch --configuration development", "test": "ng test" }, "private": true, "dependencies": { "@angular/platform-server": "^15.0.4", "bootstrap": "^5.1.3", "jquery": "^3.6.0", "oidc-client": "^1.11.5", "popper.js": "^1.16.0", "run-script-os": "^1.1.6", "@angular/animations": "~15.0.0", "@angular/cdk": "15.0.3", "@angular/common": "~15.0.0", "@angular/compiler": "~15.0.0", "@angular/core": "~15.0.0", "@angular/forms": "~15.0.0", "@angular/material": "15.0.3", "@angular/material-moment-adapter": "15.0.3", "@angular/platform-browser": "~15.0.0", "@angular/platform-browser-dynamic": "~15.0.0", "@angular/router": "~15.0.0", "moment": "^2.18.1", "rxjs": "~7.4.0", "tslib": "^2.3.0", "zone.js": "~0.11.5" }, "devDependencies": { "@angular-devkit/build-angular": "^15.0.4", "@angular/cli": "^15.0.4", "@angular/compiler-cli": "^15.0.4", "@types/jasmine": "~4.0.3", "@types/jasminewd2": "~2.0.10", "@types/node": "^18.0.0", "jasmine-core": "~4.2.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.1.1", "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "^2.0.0", "typescript": "~4.8.4" }, "overrides": { "autoprefixer": "10.4.5" } }
排查及解决步骤
重新安装依赖
删除node_modules文件夹和package-lock.json,执行npm install,确保Angular Material的依赖完整下载,检查node_modules/@angular/material目录下是否存在_index.scss文件。修正路径配置
将angular.json中stylePreprocessorOptions的路径改为./node_modules,明确相对路径:"stylePreprocessorOptions": { "includePaths": ["./node_modules"] }补全test配置的路径规则
在angular.json的test选项中添加同样的stylePreprocessorOptions配置,避免测试环境编译报错。检查Sass版本
执行npm ls sass查看当前Sass版本,确保是^1.55.0以上的稳定版本,版本不匹配则执行npm install sass@^1.55.0 --save-dev手动安装。测试完整路径导入
临时将样式文件中的@use '@angular/material' as mat;替换为@use '../node_modules/@angular/material' as mat;,如果能正常编译,说明路径解析存在环境差异,需进一步调整angular.json的配置。
内容的提问来源于stack exchange,提问作者mitch fiedler

