Как импортировать 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.
Но это не так.
Что я должен сделать, чтобы иметь правильное решение?
Решения, которые я НЕ прошу:
- "Скопируйте внешний модуль CSS в папку ресурсов и используйте его оттуда"
- Я ищу решение, которое работает вместе с пакетом npm.
- "Используйте загрузчик для веб-пакета"
- Как я описал выше, я ищу общее решение, начальной загрузки здесь только пример.
- "Используйте другой стек"
- Я ищу решение в той самой стартовой упаковке, о которой я упоминал выше.
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": {}
}
}