Comments (2)
Hi.
Edited: Until constructible style-sheets will be fully implemented, this is a suggestion - based on native behavior of browsers.
Using the shadow root is NOT mandatory. You can visit the documentation website - http:slimjs.com and see the source maps.
If you still wish to use shadow root, I recommend either using internal style nodes with @import
statements or sharing styles using a custom element for style-sharing.
Modulizing the parts you wish to import into your component improves performance, in case you choose to go with shadow DOMs.
Check out this implementation (taken from a production code) - modulizing css into blocks and sharing between shadow DOMs.
const valueCache: Record<string, Promise<string>> = typeof (<any>window)['AppContext'] === 'object' ? (<any>window)['AppContext'].getConfig('styleCache') : {};
export class StyleLoader extends HTMLElement {
connectedCallback () {
const href = this.getAttribute('href');
const name = this.getAttribute('name');
if (!name || !href) {
return;
}
if (valueCache[name] && typeof (<any>valueCache[name]).resolve === 'function') {
const resolve = (<any>valueCache[name]).resolve;
fetch(href)
.then(r => r.text())
.then(styleText => resolve(styleText.replace(/([\n|\r|\t])/gm, '')))
.catch(() => {});
}
if (!valueCache[name]) {
valueCache[name] = new Promise((resolve, reject) => {
fetch(href).then(r => r.text()).then(styleText => resolve(styleText.replace(/([\n|\r|\t])/gm, ''))).catch(reject);
});
}
}
}
export class SharedStyle extends HTMLStyleElement {
public styleLoaded = false;
constructor() {
super();
this.applyStyle();
}
connectedCallback() {
this.applyStyle();
}
applyStyle() {
if (this.styleLoaded) {
return;
}
const name = this.getAttribute('name');
if (name) {
let p = valueCache[name];
if (!p) {
let resolve;
p = new Promise<string>(res => resolve = res);
(<any>p).resolve = resolve;
valueCache[name] = p;
}
p.then(text => this.innerHTML = text);
this.styleLoaded = true;
}
}
}
customElements.define('shared-style', SharedStyle, {extends: 'style'});
customElements.define('style-loader', StyleLoader);
the usage is simple:
in the main HTML
<style-loader href="/path/to/buttons.css" name="buttons"></style-loader>
<style-loader href="/path/to/menus.css" name="menus"></style-loader>
in your shadow root (any component)
<style is="shared-style" name="buttons"></style>
This implementation is performant, I'm using it on production on several projects, as long as you keep you CSS "blocks" separate correctly, it's super-fast.
from slim.js.
Thank you so much Avichay Eyal !
Mazel tov! It's a great library my friend
רודריגו
from slim.js.
Related Issues (20)
- package.json.module is pointing to an unexisting file HOT 1
- Storybook components HOT 2
- Typing for attributeChangedCallback lacks parameters HOT 1
- WEBP Support HOT 3
- "Uncaught TypeError" when using slim-js with @babel/preset-env HOT 4
- s:if Conditional rendering not working HOT 9
- Non-minified package distribution HOT 1
- if directive inside foreach directive HOT 3
- Idea for cleaner templates HOT 1
- Unresponsive counter component HOT 2
- Documentation Site - "Oops, this page does not exists" HOT 1
- How does the property directive work? HOT 11
- Query in template css class name does not work in object usage only in object creation HOT 1
- Issue with Webpack exports
- How to setup vscode with `/*html*/` and typings HOT 2
- Links broken on slimjs.org HOT 1
- What is the point of this library? HOT 1
- Is this repo still active? HOT 2
- How to use the CDN?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from slim.js.