Angular: Как разобрать JSON переменные в SCSS - PullRequest
8 голосов
/ 03 марта 2020

В приложении Angular я делаю визуальные эффекты D3 через обычные D3 или Vega . Там также происходит стиль S CSS.

Я бы хотел иметь возможность ссылаться на одни и те же глобальные переменные для стиля из Javascript и из S CSS. Файлы JSON отлично справляются с задачей сохранения настроек, которые я загружаю в Typescript с помощью простого оператора import. Но как можно go сделать то же самое с S CSS?

node-sass-json-importer кажется хорошим кандидатом, но добавление его в CLI-приложение Angular 9 не очевидно для меня.

Эта публикация StackOverflow некоторое время назад затрагивала topi c, но она включала изменение ресурсов под node_modules, что вряд ли является устойчивым.

В оригинальном do c есть также некоторые входные данные для , как можно go настроить веб-пакет в не Angular приложении . Я не знаю, как связать это с Angular приложением, созданным через CLI.

Webpack / sass-загрузчик Blockquote

Webpack v1

import jsonImporter from 'node-sass-json-importer';

// Webpack config
export default {
  module: {
    loaders: [{
      test: /\.scss$/,
      loaders: ["style", "css", "sass"]
    }],
  },
  // Apply the JSON importer via sass-loader's options.
  sassLoader: {
    importer: jsonImporter()
  }
};

Webpack v2

import jsonImporter from 'node-sass-json-importer';

// Webpack config
export default {
  module: {
    rules: [
      test: /\.scss$/,
      use: [
        'style-loader',
        {
          loader: 'css-loader',
          options: {
            importLoaders: 1
          },
        },
        {
          loader: 'sass-loader',
          // Apply the JSON importer via sass-loader's options.
          options: {
            importer: jsonImporter(),
          },
        },
      ],
    ],
  },
};

Ответы [ 3 ]

5 голосов
/ 25 марта 2020

Вы можете сделать это без изменения файлов node_modules, используя @angular-builders/custom-webpack для настройки пользовательских правил Webpack и, как вы упомянули, node-sass-json-importer для импорта JSON файлов внутри S CSS files.

Вам необходимо установить node-sass для опции implementation, поскольку node-sass-json-importer совместимо с node-sass.

  1. Установить пакеты @angular-builders/custom-webpack, node-sass-json-importer и node-sass:

    npm i -D @angular-builders/custom-webpack node-sass-json-importer node-sass
    
  2. Создать файл конфигурации Webpack (webpack.config.js) в каталоге проекта root со следующим содержимым:

    const jsonImporter = require('node-sass-json-importer');
    
    module.exports = {
      module: {
        rules: [{
          test: /\.scss$|\.sass$/,
          use: [
            {
              loader: require.resolve('sass-loader'),
              options: {
                implementation: require('node-sass'),
                sassOptions: {
                  // bootstrap-sass requires a minimum precision of 8
                  precision: 8,
                  importer: jsonImporter(),
                  outputStyle: 'expanded'
                }
              },
            }
          ],
        }],
      },
    }
    
  3. Измените builder на @angular-builders/custom-webpack:[architect-target] и добавьте параметр customWebpackConfig в build, serve и test, чтобы строить цели внутри angular.json:

    "projects": {
      ...
      "[project]": {
        ...
        "architect": {
          "build": {
            "builder: "@angular-builders/custom-webpack:browser",
            "options": {
              "customWebpackConfig": {
                "path": "webpack.config.js"
              },
              ...
            },
            ...
          },
          "serve": {
            "builder: "@angular-builders/custom-webpack:dev-server",
            "customWebpackConfig": {
              "path": "webpack.config.js"
            },
            ...
          },
          "test": {
            "builder: "@angular-builders/custom-webpack:karma",
            "customWebpackConfig": {
              "path": "webpack.config.js"
            },
            ...
          },
        },
        ...
      },
      ...
    }
    

Сейчас Вы можете включить любой .json файл в любой компонент .scss файл:

hello-world.component.scss:

@import 'hello-world.vars.json';

.hello-bg {
  padding: 20px;
  background-color: $bg-color;
  border: 2px solid $border-color;
}

hello-world.vars.json:

{
  "bg-color": "yellow",
  "border-color": "red"
}

У меня есть создал репозиторий Github со всеми этими работающими, которые вы можете клонировать и тестировать отсюда: https://github.com/clytras/angular-json-scss

git clone https://github.com/clytras/angular-json-scss.git
cd angular-json-scss
npm install
ng serve
3 голосов
/ 28 марта 2020

Другой вариант - использовать raw-loader, он доступен по умолчанию в angular -cli. Таким образом, вы можете загрузить необработанный файл s css в компонент ts:

// Adding `!!` to a request will disable all loaders specified in the configuration
import scss from '!!raw-loader!./config.scss';

console.info('scss', scss);

Вы должны объявить модуль в файле .d.ts:

declare module '!!raw-loader!./*.scss';

Затем вы можете извлечь любую информацию вы хотите.

Таким образом, вместо загрузки JSON в s css вы можете загрузить s css в ts.

2 голосов
/ 28 марта 2020

У меня есть относительно простой подход для вас:

Отделите шаг node-sass от шага ng build и используйте созданные файлы .css вместо файлов sass в вашем angular app.

Это имеет два преимущества:

  • не нужно сильно настраивать и редактировать любые узлы-модули
  • полный контроль над компиляцией sass

Для реализации я бы go продвинулся следующим образом:

  1. добавьте ./node_modules/.bin/node-sass --importer node_modules/node-sass-json-importer/dist/cli.js --recursive ./src --output ./src к сценариям в вашем package.json, например, с именем build-sass. Вы можете настроить эту команду так, чтобы она включала только те файлы sass, для которых вам необходим рекурсивный режим (обязательно игнорируйте их в angular. json, чтобы они не компилировались дважды).
  2. выполните команду один раз npm run build-sass, чтобы сгенерировать файлы .css в проекте.
  3. при необходимости измените ссылки в angular компонентах с .sass на .css
  4. (опционально) добавьте в свой пакет вспомогательную команду npm run build-sass && ng build как compile. json, которую вы можете запустить, когда захотите собрать весь проект.

Хотя этот подход относительно прост, он имеет несколько недостатков

  • для любых компонентов, для которых вы хотите использовать css, функцию горячей перезагрузки: ng serve потребует от вас запуска npm run build-sass для просмотра изменений, внесенных вами в ваши стили в режиме реального времени
  • ваш проект будет выглядеть немного грязнее, так как есть файлы .scss и .css для того же компонента в папке /src, из которого создается .css. Вам нужно будет убедиться (например, добавив суффикс или комментарий), что никто случайно не отредактирует сгенерированный .css, и эти изменения будут переопределены.

Другие подходы почти всегда включают интенсивное редактирование существующих или запись ваш собственный компилятор webpack.

...