Angular: Cách phân tích các biến JSON thành SCSS


8

Trong một ứng dụng Angular, tôi thực hiện hình ảnh D3 thông qua D3 hoặc Vega đơn giản . Cũng có phong cách SCSS đang diễn ra.

Tôi muốn có thể tham khảo các biến toàn cục tương tự để tạo kiểu từ Javascript và từ SCSS. Các tệp JSON thực hiện thủ thuật rất tốt để lưu trữ các cài đặt mà tôi tải vào Bản mô tả thông qua một importcâu lệnh đơn giản . Nhưng làm thế nào để một người đi làm tương tự từ SCSS?

node-sass-json-importer có vẻ như là một ứng cử viên tốt nhưng việc thêm nó vào ứng dụng Angular 9 CLI không rõ ràng đối với tôi.

Bài đăng StackOverflow này đã đánh dấu chủ đề một thời gian trước, nhưng nó liên quan đến việc sửa đổi các tài nguyên theo node_modulesđó hầu như không bền vững.

Ngoài ra còn có một số đầu vào trong tài liệu gốc về cách người ta có thể điều chỉnh gói webpack trong một ứng dụng không phải là Angular . Tôi không biết làm thế nào để liên kết điều này với một ứng dụng Angular được xây dựng thông qua CLI.

Webpack / sass-loader Blockquote

Gói web 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()
  }
};

Gói web 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(),
          },
        },
      ],
    ],
  },
};

1
Có lẽ đây là một lựa chọn? npmjs.com/package/@angular-builders/custom-webpack
MikeOne


nó dường như liên quan đến nhà nhập khẩu nút-sass-json nhưng thử thách còn lại của tôi sẽ khiến nó hoạt động trong ứng dụng Angular 9 CLI
BuZz

Tôi đã không đánh giá thấp bất cứ điều gì. Bất cứ ai cũng có thể downvote, không chỉ OP.
BuZz

Câu trả lời:


5

Bạn có thể làm điều đó mà không thay đổi bất kỳ node_modules tệp bằng cách sử dụng @angular-builders/custom-webpackđể thiết lập các quy tắc Webpack tùy chỉnh và như bạn đã đề cập node-sass-json-importerđể nhập các tệp JSON bên trong các tệp SCSS.

Bạn sẽ phải cài đặt node-sasscho các implementationtùy chọn vì node-sass-json-importertương thích vớinode-sass .

  1. Cài đặt các gói @angular-builders/custom-webpack, node-sass-json-importernode-sass :

    npm i -D @angular-builders/custom-webpack node-sass-json-importer node-sass
  2. Tạo tập tin cấu hình Webpack (webpack.config.js ) vào thư mục gốc của dự án với các nội dung sau:

    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. Thay đổi builderđể @angular-builders/custom-webpack:[architect-target]và add customWebpackConfigtùy chọn để build, servetestxây dựng các mục tiêu bên trong 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"
            },
            ...
          },
        },
        ...
      },
      ...
    }

Bây giờ bạn có thể bao gồm bất kỳ .json tệp nào bên trong bất kỳ .scsstệp thành phần nào :

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"
}

Tôi đã tạo một kho lưu trữ Github với tất cả các hoạt động này mà bạn có thể sao chép và kiểm tra từ đây: 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

Một tùy chọn khác là sử dụng raw-loader, nó có sẵn theo mặc định trong angular-cli. Bằng cách này, bạn có thể tải tệp scss thô vào thành phần ts:

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

console.info('scss', scss);

Bạn phải khai báo mô-đun trong .d.tstệp:

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

Sau đó, bạn có thể trích xuất bất kỳ thông tin bạn muốn.

Vì vậy, thay vì tải JSON vào scss, bạn có thể tải scss vào ts.


Điều này làm việc cho tôi, nhưng tôi thấy nó hơi khó theo dõi. Vui lòng cung cấp tên tệp ví dụ cho mô-đun khai báo (.d.ts) và biểu định kiểu (.scss). Nó cũng sẽ hữu ích nếu bạn cung cấp một số mã .scss và cách bạn sẽ truy cập nó. Tôi đã có thể sử dụng các biểu thức thông thường, nhưng tệp .scss phức tạp hơn có thể khó nhắm mục tiêu như vậy.
Todd

2

Tôi có một cách tiếp cận tương đối đơn giản cho bạn:

Tách node-sassbước tạo thành ng buildbước và sử dụng các .csstệp được tạo thay vìsass tệp trong ứng dụng góc của bạn.

Điều này có hai lợi thế:

  • không cần chỉnh nhiều và chỉnh sửa bất kỳ mô-đun nút nào
  • toàn quyền kiểm soát cách thức sass được biên dịch

Để thực hiện tôi sẽ đi trước như sau:

  1. thêm ./node_modules/.bin/node-sass --importer node_modules/node-sass-json-importer/dist/cli.js --recursive ./src --output ./srcvào các tập lệnh trong package.jsonví dụ của bạn với tên build-sass. Bạn có thể điều chỉnh lệnh này để chỉ bao gồm các tệp sass mà bạn cần chế độ đệ quy cho (đảm bảo bỏ qua chúng trong angular.json, để chúng không được biên dịch hai lần).
  2. chạy lệnh một lần npm run build-sassđể tạo các .csstệp trong dự án.
  3. tài liệu tham khảo sự thay đổi trong thành phần góc nơi cần thiết từ .sassđến.css
  4. (tùy chọn) thêm một lệnh tiện lợi npm run build-sass && ng buildnhư compiletrong gói.json mà bạn có thể chạy bất cứ khi nào bạn muốn xây dựng toàn bộ dự án.

Mặc dù cách tiếp cận này tương đối đơn giản, nó đi kèm với một vài nhược điểm

  • đối với bất kỳ thành phần nào bạn muốn sử dụng css, tính năng tải lại nóng của ng serve sẽ yêu cầu bạn chạynpm run build-sass để xem bất kỳ thay đổi nào bạn đã thực hiện cho kiểu của mình trong thời gian thực
  • dự án của bạn sẽ trông rắc rối hơn một chút, vì có .scss.css các tệp cho cùng một thành phần trong /srcthư mục .cssđược tạo. Bạn sẽ cần đảm bảo (ví dụ: bằng cách thêm hậu tố hoặc nhận xét) mà không ai vô tình chỉnh sửa nội dung được tạo .cssvà những thay đổi đó sẽ bị ghi đè.

Các cách tiếp cận khác hầu như luôn luôn liên quan đến việc chỉnh sửa rất nhiều hiện có hoặc viết trình biên dịch webpack của riêng bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.