Используйте [hash: base64: 5] в файле JavaScript / TypeScript.

Я использую модули CSS в проекте Angular с Webpack. Я уже преобразовал имена классов в .css и .scss файлах с помощью postcss-модулей.

Затем с помощью posthtml-css-modules я изменил значения свойства класса в элементах html. для его хеш-значения, определенного postcss-modules.

Могу сказать, что все работает нормально ????.

Теперь мне нужно решить новую задачу.

Angular имеет функцию, которая позволяет вам динамически изменять значение class в элементе html в зависимости от условия:

https://angular.io/api/common/NgClass

Например, я могу:

<div [className]="myVar ? 'myClass1' : 'myClass2' " >

Если myVar = true, элемент html будет:

<div class="myClass1" >

И если myVar = false, элемент html будет:

<div class="myClass2" >

Как будто я не знаю, каким будет значение myVar во время компиляции (поскольку значение myVar зависит от действий пользователя), я не могу установить значение для <div css-module="myClass1" > или <div css-module="myClass2" >, чтобы хешировать имена классов myClass1 или myClass2.

НО (вот и мое решение) ...

Если я могу вызвать ту же функцию, которая выполняет [hash:base64:5] (https://github.com/css-modules/postcss-modules#generating-scoped-names)

Я могу создать функцию, которая получает строку в качестве параметра и возвращает имя класса в виде хеша.

Это было бы примерно так:

<div [className]="setMyClassNameInHash(myVar)">

Затем в javascript:

function setMyClassNameInHash(condition) {
      return  condition ? doHash64('myClass1') : doHash64('myClass1');
}

doHash64() будет функцией, которая принимает строку и возвращает хеш с использованием [hash:base64:5].

В заключение мой вопрос:

¿Как я могу вызвать ту же функцию, которая выполняет [hash: base64: 5] в файле javascript?

Спасибо!!!!


person German Quinteros    schedule 03.03.2020    source источник


Ответы (1)


Вам нужно будет интегрировать шаг создания шаблона в процесс сборки. Плагин экспортирует имена классов и их сопоставленные имена в файл json, поэтому вы можете найти хешированное имя класса из оригинала.

Изменить. Поскольку встроенный шаблон работает только для одного имени класса и, похоже, не поддерживает замену имен классов в таких вещах, как атрибуты angular, вы можете создать шаблоны самостоятельно, используя библиотеку шаблонов, такую ​​как lodash. Если вы уже используете grunt или gulp, я бы рекомендовал использовать их задачи-шаблоны вместо этого ручного способа, потому что они многое делают за вас, например, поддерживают несколько файлов.

В вашем html вы должны использовать разделители lodash, чтобы получить имя хешированного класса, например:

<div [className]="myVar
     ? '<%= getHashedClass('myClass1') %>'
     : '<%= getHashedClass('myClass2') %>' " >

Ваш сценарий сборки узла может выглядеть так:

var fs = require('fs');

postcss([
  require("postcss-modules")({
    // Callback to get hashed class names
    getJSON: function(cssFileName, classNames, outputFileName) {
      var filePath = '/path/to/outputDir/file.html';

      // Function to lookup hashed class names
      var getHashedClass = function(unhashedClass) {
        return classNames[unhashedClass];
      }

      // Read your html file as a string
      var html = fs.readFileSync(path),

      // Use lodash to template it, passing the class lookup function
      var compiled = _.template(html);
      var templated = compiled({
        getHashedClass: getHashedClass
      });

      // Write the templated html
      fs.writeFileSync(path, templated);
    }
  })
]);
person frodo2975    schedule 05.03.2020
comment
Привет @ frodo2975, я уже сделал то, что ты сказал. Моя проблема в другом, я не могу хешировать значение класса в html, когда класс динамически устанавливается в Angular. Один из вариантов - взять значение из файла json, но этот вариант не масштабируется, потому что я не могу загрузить более 30 файлов json в производственную среду. - person German Quinteros; 05.03.2020
comment
Я думаю, вам что-то не хватает, если я правильно понимаю, он выполняет подкачку во время компиляции. Поэтому после создания приложения в вашем html должны быть подставлены два имени хешированных классов. Загрузка файла во время выполнения будет ненужной. - person frodo2975; 06.03.2020
comment
Да, оба класса хешируются в файле .scss. Однако, когда я собираюсь изменить имя класса в html через posthtml-css-modules, у него нет директивы для динамического класса, потому что css-module применяется только для имен классов, которые не собираются изменять свое значение во время выполнения. . Я лучше объяснил проблему? Спасибо за вашу помощь. - person German Quinteros; 06.03.2020
comment
Посмотрев на это еще раз, мне кажется, я понял, о чем вы говорите. Поскольку он использует атрибут css-module, это не буквальный поиск / замена для класса, поэтому он не будет работать для строк js в атрибутах html. Я обновлю свой ответ - person frodo2975; 06.03.2020
comment
Спасибо за ваш ответ. Я попробую и дам знать, сработает ли это. - person German Quinteros; 06.03.2020
comment
ваши решения работают. Единственная проблема заключается в том, что он переопределяет исходный файл и удаляет '<%= getHashedClass('myClass1') %>' для хэша. Но я могу создать некомпилированный файл и еще один после компиляции. - person German Quinteros; 12.03.2020
comment
Круто, если вы не хотите, чтобы он перезаписывался, просто измените место, где вы пишете шаблонный html. - person frodo2975; 13.03.2020
comment
спасибо за этот совет. Я использую веб-пакет в качестве компилятора. Итак, после выполнения posthtml-css-modules я выполняю свой собственный загрузчик веб-пакетов, который меняет имена классов для имен хешированных классов, используя сценарий, который вы мне предоставили. С помощью этого решения я не меняю исходный HTML. Большое спасибо за вашу помощь !!! - person German Quinteros; 26.03.2020