Как импортировать CSS из node_modules в приложение webpack angular2

Допустим, мы начинаем со следующего стартового пакета: https://github.com/angularclass/angular2-webpack-starter

После npm install а также npm run start все отлично работает

Я хочу добавить внешний модуль CSS, например, CSS начальной загрузки 4 (и только CSS). (Я знаю, что у bootstrap есть загрузчик начальной загрузки, но сейчас я прошу общее решение, поэтому, пожалуйста, подумайте о начальной загрузке 4 здесь, так как это может быть любой другой модуль css, доступный через npm).

Я устанавливаю бутстрап через npm: npm install bootstrap@4.0.0-alpha.4 --save

Сначала я подумал, что достаточно добавить import 'bootstrap/dist/css/bootstrap.css'; в файл vendor.browser.ts.

Но это не так.

Что я должен сделать, чтобы иметь правильное решение?

Решения, которые я НЕ прошу:

  1. "Скопируйте внешний модуль CSS в папку ресурсов и используйте его оттуда"
    • Я ищу решение, которое работает вместе с пакетом npm.
  2. "Используйте загрузчик для веб-пакета"
    • Как я описал выше, я ищу общее решение, начальной загрузки здесь только пример.
  3. "Используйте другой стек"
    • Я ищу решение в той самой стартовой упаковке, о которой я упоминал выше.

3 ответа

Решение

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

Зачем? Ну, потому что эта строка:

import 'bootstrap/dist/css/bootstrap.css';

Это только импорт вашего CSS в виде строки, когда в действительности вы хотите, чтобы ваш поставщик CSS в теге стиля. Если вы проверите config/webpack.commons.js вы найдете это правило:

 {
   test: /\.css$/,
   loaders: ['to-string-loader', 'css-loader']
 },

Это правило позволяет вашим компонентам импортировать файлы CSS, в основном это:

@Component({
  selector: 'app',
  encapsulation: ViewEncapsulation.None,
  styleUrls: [
    './app.component.css' // this why you import css as string
  ],

В AppComponent нет инкапсуляции, из-за этой строки encapsulation: ViewEncapsulation.None, Это означает, что любые правила CSS будут применяться к вашему приложению глобально. Таким образом, вы можете импортировать стили начальной загрузки в свой компонент приложения:

@Component({
  selector: 'app',
  encapsulation: ViewEncapsulation.None,
  styleUrls: [
    './app.component.css',
    '../../node_modules/bootstrap/dist/css/bootstrap.css'
  ],

Но если вы настаиваете на импорте в ваш vendor.ts тогда вам нужно будет установить новый загрузчик, npm i style-loader --save-dev это позволит веб-пакету ввести CSS на вашу страницу. Затем вам нужно создать определенное правило на вашем webpack.common.js и изменить существующее:

 { //this rule will only be used for any vendors
   test: /\.css$/,
   loaders: ['style-loader', 'css-loader'],
   include: [/node_modules/]
 },
 {
   test: /\.css$/,
   loaders: ['to-string-loader', 'css-loader'],
   exclude: [/node_modules/] //add this line so we ignore css coming from node_modules
 },

Первое правило будет применяться только при попытке импортировать CSS из любого пакета внутри node_modules второе правило будет применено к любому CSS, который вы импортируете извне node_modules

Это возможно с помощью @import '~bootstrap/dist/css/bootstrap.css'; в файле styles.css. (Обратите внимание на ~)

Редактировать: Как это работает - '~' - это псевдоним, заданный в конфигурации веб-пакета, указывающий на папку ресурсов... просто так...

Так вот способ импортировать различные CSS файлы с использованием angular-cli который я считаю наиболее удобным.

В основном, вы можете обратиться к CSS файлы (порядок важен, если вы будете переопределять их) в конфигурации и angular-cli позаботится об остальном. Например, вы можете включить пару стилей из узловых модулей, что можно сделать следующим образом:

"styles": [
    "../node_modules/font-awesome/css/font-awesome.min.css",
    "../node_modules/primeng/resources/primeng.min.css",
    "styles.css"
  ]

Пример полной конфигурации может выглядеть следующим образом:

.angular-cli.json

{
  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
  "project": {
    "name": "my-angular-app"
  },
  "apps": [
    {
      "root": "src",
      "outDir": "dist",
      "assets": [
        "assets",
        "favicon.ico"
      ],
      "index": "index.html",
      "main": "main.ts",
      "polyfills": "polyfills.ts",
      "test": "test.ts",
      "tsconfig": "tsconfig.app.json",
      "testTsconfig": "tsconfig.spec.json",
      "prefix": "app",
      "styles": [
        "../node_modules/font-awesome/css/font-awesome.min.css",
        "../node_modules/primeng/resources/primeng.min.css",
        "styles.css"
      ],
      "scripts": [],
      "environmentSource": "environments/environment.ts",
      "environments": {
        "dev": "environments/environment.ts",
        "prod": "environments/environment.prod.ts"
      }
    }
  ],
  "e2e": {
    "protractor": {
      "config": "./protractor.conf.js"
    }
  },
  "lint": [
    {
      "project": "src/tsconfig.app.json",
      "exclude": "**/node_modules/**"
    },
    {
      "project": "src/tsconfig.spec.json",
      "exclude": "**/node_modules/**"
    },
    {
      "project": "e2e/tsconfig.e2e.json",
      "exclude": "**/node_modules/**"
    }
  ],
  "test": {
    "karma": {
      "config": "./karma.conf.js"
    }
  },
  "defaults": {
    "styleExt": "scss",
    "component": {}
  }
}
Другие вопросы по тегам