Переход с node-sass на dart sass в моем проекте angular-cli

У меня были проблемы с тем, что node-sass делал всевозможные глупости во время "установки npm", включая, помимо прочего:

  • GNU c ++ что-то компилирует (скорее всего, сам)
  • пытаюсь запустить python2.7
  • пытаюсь запустить любую другую версию python
  • пытаюсь подключиться к github

и это создавало проблемы в корпоративном контексте, где мне нужно скомпилировать свой проект на Jenkins, где библиотеки NPM должны быть извлечены из клона реестра npm на корпоративных серверах, и на докерах доступны только строгие требования этого конкретного проекта, поэтому:

  • нет github
  • нет питона
  • no c++

и я решил, что с меня хватит махинаций node-sass, поэтому я попробовал предложенный «dart-sass», так как кажется, что он полностью совместим с angular и направлен на решение большинства проблем с node-sass : https://sass-lang.com/dart-sass

Я попытался удалить node-sass и поставить вместо него dart-sass:

npm remove node-sass
npm install dart-sass
ng serve

но это вызывает:

Module build failed (from ./node_modules/sass-loader/lib/loader.js):
Error: Cannot find module 'node-sass'

для каждого компонента в проекте.

почему он все еще ищет node-sass?

вот мой package.json:

{
  "name": "web.ui",
  "version": "0.0.0",
  "license": "MIT",
  "scripts": {
    "ng": "ng",
    "start": "ng serve --aot=false --proxy-config proxy.json",
    "build": "ng b --prod",
    "builden": "ng b --prod --configuration=en",
    "buildde": "ng b --prod --configuration=de",
    "test": "ng test",
    "lint": "ng lint",
    "ngc": "ngc"
  },
  "private": true,
  "dependencies": {
    "@angular/animations": "^7.0.3",
    "@angular/cdk": "^7.0.3",
    "@angular/common": "^7.0.3",
    "@angular/compiler": "^7.0.3",
    "@angular/core": "^7.0.3",
    "@angular/forms": "^7.0.3",
    "@angular/http": "^7.0.3",
    "@angular/material": "^7.0.3",
    "@angular/material-moment-adapter": "^7.0.3",
    "@angular/platform-browser": "^7.0.3",
    "@angular/platform-browser-dynamic": "^7.0.3",
    "@angular/router": "^7.0.3",
    "@ngx-translate/core": "^11.0.0",
    "@ngx-translate/http-loader": "^4.0.0",
    "@ngx-translate/i18n-polyfill": "^1.0.0",
    "@types/underscore": "^1.8.7",
    "angular-font-awesome": "^3.1.2",
    "bootstrap": "^4.1.1",
    "classlist.js": "^1.1.20150312",
    "core-js": "^2.5.3",
    "dart-sass": "^1.15.0",
    "dom-autoscroller": "^2.3.4",
    "file-saver": "^2.0.0-rc.4",
    "font-awesome": "^4.7.0",
    "iconv-lite": "^0.4.23",
    "lodash": "^4.17.5",
    "moment": "^2.22.2",
    "ng-snotify": "^4.3.1",
    "ng2-ion-range-slider": "^2.0.0",
    "ngx-bootstrap": "^3.1.1",
    "popper.js": "^1.14.3",
    "rxjs": "^6.2.0",
    "typescript": "3.1.6",
    "underscore": "^1.9.1",
    "web-animations-js": "^2.3.1",
    "zone.js": "^0.8.20"
  },
  "devDependencies": {
    "@angular-devkit/build-angular": "~0.10.0",
    "@angular/cli": "^7.0.5",
    "@angular/compiler-cli": "^7.0.3",
    "@angular/language-service": "^7.0.3",
    "@types/jasmine": "^2.8.9",
    "@types/jasminewd2": "~2.0.5",
    "@types/node": "~10.12.1",
    "codelyzer": "^4.5.0",
    "postcss-modules": "^1.4.1",
    "protractor": "~5.4.0",
    "ts-node": "~7.0.1",
    "tslint": "~5.11.0"
  }
}

вот мой angular.json:

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "version": 1,
  "newProjectRoot": "projects",
  "projects": {
    "web.ui": {
      "root": "",
      "sourceRoot": "src",
      "projectType": "application",
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "outputPath": "dist",
            "index": "src/index.html",
            "main": "src/main.ts",
            "tsConfig": "src/tsconfig.app.json",
            "polyfills": "src/polyfills.ts",
            "assets": [
              "src/assets",
              "src/favicon.ico",
              "src/assets/images"
            ],
            "styles": [
              "node_modules/ng-snotify/styles/simple.scss",
              "node_modules/ion-rangeslider/css/ion.rangeSlider.css",
              "node_modules/font-awesome/css/font-awesome.css",
              "node_modules/bootstrap/dist/css/bootstrap.min.css",
              "src/app/logged.in/content/routing/common/styles/ion.slider.style.scss",
              "src/styles.scss"
            ],
            "scripts": [
              "node_modules/jquery/dist/jquery.min.js",
              "node_modules/ion-rangeslider/js/ion.rangeSlider.min.js"
            ]
          },
          "configurations": {
            "en": {
              "aot": true,
              "outputPath": "dist/en/",
              "i18nFile": "src/assets/i18n/en.xlf",
              "i18nFormat": "xlf",
              "i18nLocale": "en",
              "i18nMissingTranslation": "error"
            },
            "production": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true
            },
            "production-en": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "outputPath": "dist/my-project-en/",
              "i18nFile": "src/assets/i18n/en.xlf",
              "i18nFormat": "xlf",
              "i18nLocale": "en",
              "i18nMissingTranslation": "error"
            },
            "production-de": {
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ],
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "aot": true,
              "extractLicenses": true,
              "vendorChunk": false,
              "buildOptimizer": true,
              "outputPath": "dist/my-project-en/",
              "i18nFile": "src/assets/i18n/de.xlf",
              "i18nFormat": "xlf",
              "i18nLocale": "en",
              "i18nMissingTranslation": "error"
            }
          }
        },
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "web.ui:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "web.ui:build:production"
            },
            "en": {
              "browserTarget": "web.ui:build:en"
            },
            "production-en": {
              "browserTarget": "web.ui:build:production-en"
            },
            "production-de": {
              "browserTarget": "web.ui:build:production-de"
            }
          }
        },
        "extract-i18n": {
          "builder": "@angular-devkit/build-angular:extract-i18n",
          "options": {
            "browserTarget": "web.ui:build"
          }
        },
        "lint": {
          "builder": "@angular-devkit/build-angular:tslint",
          "options": {
            "tsConfig": [
              "src/tsconfig.app.json"
            ],
            "exclude": [
              "**/node_modules/**"
            ]
          }
        }
      }
    },
    "web.ui-e2e": {
      "root": "",
      "sourceRoot": "",
      "projectType": "application"
    }
  },
  "defaultProject": "web.ui",
  "cli": {
    "warnings": {
      "typescriptMismatch": false
    }
  },
  "schematics": {
    "@schematics/angular:component": {
      "prefix": "app",
      "styleext": "scss"
    },
    "@schematics/angular:directive": {
      "prefix": "app"
    }
  }
}

вот как выполняется добавление sass под dart (фреймворк js), кстати: Интегрирован ли Dart с SASS ?

но этот метод не подходит для angular.

Обновлять :

Я пробовал использовать это: Как найти обратные зависимости в пакете npm?

чтобы выяснить, что зависело / тянуло node-sass, несмотря на все мои усилия, и оказалось, что это было: @ angular-devkit / build-angular

но если я удалю это, то подача ng будет недовольна. он говорит, что ему это нужно.


person tatsu    schedule 15.11.2018    source источник
comment
Черт возьми, лучшие новости. Я сразу же перехожу с node-sass на sass. Большое спасибо за эту информацию   -  person Deunz    schedule 25.08.2020


Ответы (2)


@angular-devkit/build-angular поддерживает dart sass, только вы используете неправильный модуль, попробуйте npm install sass вместо dart-sass.

Вы можете увидеть исходный код, подтверждающий это, здесь: https://github.com/angular/angular-cli/pull/11791/commit/2c26bce9a5e2472239d755f585df9458f28b9b7f.

person suazithustra    schedule 21.12.2018

FWIW, чтобы получить angular 7.x, использовать пакет sass и не пытаться установить node-sass, мне пришлось:

  1. удалить @angular-devkit/build-angular из моего package.json
  2. удалить node_modules
  3. npm install
  4. npm i -D sass
  5. добавить обратно в 0.13.10 из @angular-devkit/build-angular в package.json
  6. npm установить снова.
person CleverPatrick    schedule 12.06.2020
comment
Я также использую angular 7.x, и это именно то, что я искал. Спасибо! - person jalbr74; 12.06.2020
comment
У меня это не сработало, кажется, я все еще пытаюсь использовать node-sass, и я тоже использую Angular 7. Есть ли у вас еще какие-нибудь советы по этому поводу? Не распознает @use: "sass:map" во время компиляции. - person codenamezero; 06.11.2020
comment
Можете ли вы убедиться, что node-sass отсутствует после шага 3? Если он есть, он должен быть установлен другой зависимостью. Если node-sass отсутствует даже после шага 6, и проблема связана только с упомянутой вами sass: map, откройте еще одну заявку SO специально о sass и sass: map, и я постараюсь помочь вам в этом вопросе. - person CleverPatrick; 08.11.2020
comment
Это сработало для меня в проекте Angular 7.x, спасибо. - person jturmel; 25.05.2021
comment
не забывай npm uninstall node-sass :) - person Cameron Hudson; 16.07.2021