#javascript #css #webpack #web-component
#javascript #css #webpack #веб-компонент
Вопрос:
Мне интересно, возможно ли внедрить .css
стили, импортированные из файла, в веб-компонент (если да, то, пожалуйста, скажите мне, как я могу этого добиться). Я использовал Webpack style-loader
для загрузки .css
стилей внутри .js
файла, но тогда я не знаю, как (или возможно ли это) внедрить эти стили в веб-компонент шаблона.
Я знаю, что могу экспортировать стили из
.js
файла, объявленного в строке шаблона, но это не то решение, которое я ищу.
Я создал репозиторий с простым примером, который вы можете найти здесь: inject-css-from-file . Я также включаю эти файлы здесь:
index.html :
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge'>
<title>Page Title</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
</head>
<body>
<kk-app></kk-app>
</body>
</html>
index.js :
import style from "./index.css";
const template = `
<style>${style}</style>
<div>
<p>Example component</p>
</div>
`;
export class App extends HTMLElement {
constructor() {
super()
this.attachShadow({ mode: 'open' });
this.shadowRoot.innerHTML = template;
}
}
customElements.define('kk-app', App);
index.css :
p {
color: red;
}
webpack.config.js :
const HTMLWebpackPlugin = require('html-webpack-plugin');
const path = require('path');
module.exports = {
mode: 'production',
entry: './index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist'),
},
module: {
rules: [
{
test: /.css$/,
use: ['style-loader', 'css-loader'],
},
],
},
resolve: {
extensions: ['.js'],
},
devServer: {
contentBase: path.join(__dirname, 'dist'),
},
plugins: [
new HTMLWebpackPlugin({
template: path.resolve(__dirname, 'index.html'),
filename: 'index.html',
}),
]
};
Ответ №1:
Итак, решением для этого было удалить style-loader
из webpack.config.js
. Правило для .css
файла должно выглядеть так:
rules: [
{
test: /.css$/,
use: ['css-loader'],
},
],
Я не знаю, почему, но style-loader
изменил эти .css
стили на объект.
PS Если вы используете
MiniCssExtractPlugin.loader
это, это вызовет ту же проблему
Комментарии:
1. Спасибо.. Ваш вопрос и ответ спасли мне день!