웹 구성 요소에 래핑된 Svelte 앱
12274 단어 webdevsveltetypescriptjavascript
자원 🙏
시작하기 전에 이 템플릿redradix에서 나를 위해 수고한 Andres Martin 및 https://github.com/redradix/svelte-custom-element-template에게 감사의 말을 전하고 싶습니다...
바쁘다면 바로 여기에서 코드를 살펴보고 가지고 놀 수 있습니다: https://github.com/stefanonepa/svelte-component-ts
왜요? 🤔
github repo redradix/svelte-custom-element-template에 설명된 대로:
Building custom elements with Svelte is really easy but have a lot of limitations, in this template I'm trying to show the way I solve most of these limitations.
Svelte current limitations:
그들은 웹 구성 요소 내부에 날씬한 앱을 래핑하는 방법인 매우 간단한 사용 사례를 해결했습니다.
어떻게? 👀
우리는 어떻게 이 기적을 이룰 수 있습니까(내부 해킹):
1. shadowRoot 래퍼 웹 구성 요소 구축
// rollup.config.js
svelte({
preprocess: sveltePreprocess({ sourceMap: !production }),
compilerOptions: {
dev: !production,
customElement: true,
},
emitCss: false,
include: './src/ShadowRoot.svelte',
}),
2. 웹 구성 요소 래퍼에 주입할 svelte 빌드
// rolup.config.js
svelte({
preprocess: sveltePreprocess({ sourceMap: !production }),
compilerOptions: {
dev: !production,
},
emitCss: true,
exclude: './src/ShadowRoot.svelte',
}),
3. 생성된 css를 shadowRoot 노드에 주입합니다.
생성된 css를 잡기 위해 로컬에서 수정
rollup-plugin-css-only
하여 각 변경 사항(재구축)에서 생성된 css를 푸시합니다.// ./.rollup/css-only.js
...
generateBundle: function generateBundle(opts, bundle) {
// Combine all stylesheets, respecting import order
var css = '';
for (var x = 0; x < order.length; x++) {
var id = order[x];
css += styles[id] || '';
}
// Emit styles through callback
if (typeof options.output === 'function') {
options.output(css, styles, bundle);
return;
}
...
그런 다음 래퍼 웹 구성 요소에 스타일 세트 💥가 있어야 한다는 중요한 주의 사항과 함께 CSS를 번들에 바로 삽입합니다(😱 Hack alert!).
import css from './.rollup/css-only';
// rollup.config.js
css({
output(styles, styleNodes, bundle) {
const match = production
? `.shadowRoot.innerHTML="`
: `.shadowRoot.innerHTML = "`;
const currentBundle = bundle[bundleFile];
currentBundle.code = currentBundle.code.replace(
match, `${match}<style>${styles}</style>`);
},
}),
4. 그림자 돔에 사용되는 경우 매끄러운 전환 포함
Svelte는 전환과 같은 몇 가지 매우 유용한 유틸리티를 제공합니다(cf. https://svelte.dev/tutorial/transition )
내 실제 이해를 위해 svelte는 헤드/문서에 동적으로 계산된 스타일을 주입하므로 전환이 그림자 돔에 적용되지 않습니다. 그렇기 때문에 문서 주입을 Shadow DOM 노드로 대체해야 합니다.
// rollup.config.js
replace({
'.ownerDocument': '.getRootNode()',
delimiters: ['', ''],
}),
replace({
'.head.appendChild': '.appendChild',
delimiters: ['', ''],
}),
결과 🏁
코드를 변경하고 자동으로 다시 빌드할 수 있는 DX(개발자 경험)와 함께 날씬한 앱을 래핑하고 즉시 사용 가능한 TypeScript 및 scss를 지원하는 웹 구성 요소가 있습니다.
스테파노네파 / svelte-component-ts
Svelte-component-ts 템플릿 🎉
이 템플릿을 사용하면 svelte를 shadow DOM
항목 구성 요소와 함께 사용한 다음 svelte의 장점을 사용하는 하위 구성 요소와 함께 사용할 수 있습니다.
이 템플릿은 https://github.com/redradix/svelte-custom-element-template 덕분에 https://github.com/MonkeyAndres에서 영감(해킹)을 훔쳤습니다.
이 템플릿에는 다음이 포함됩니다.
즉시 사용 가능한 TypeScript 지원
사스 지원
최소 구성의 babel(rollup.config.js 참조)
권장 도구
용법
degit으로 복제합니다.
npx degit stefanonepa/svelte-component-ts my-new-component
cd my-new-component
yarn
yarn dev
제약
ShadowRoot.svelte
. ⚠️ 루트 구성 요소의 스타일은 svelte에 의해 범위가 지정되지 않으므로 거기에서 일부를 사용하는 경우 선택자를 신중하게 선택하십시오 ⚠️.
왜요?
(
redradix/svelte-custom-element-template
☝️에서)Svelte로 사용자 정의 요소를 구축하는 것은 정말 쉽지만 많은 제한 사항이 있습니다. 이 템플릿은 이러한 제한 사항 대부분을 해결하는 방법을 보여주려고 합니다.
Svelte 전류 제한:
Support nested custom …
View on GitHub
할 일 👐
[ ] 핫 리로드 지원
결론
이것이 svelte가 제공하는 모든 장점을 사용하여 사용자 정의 요소를 만들려는 모든 사람에게 도움이 되기를 바랍니다. 나는 호리호리한 기여자들이 제공하는 덜 해키한 것을 찾고 싶습니다. 그러나 나는 여전히 결과에 매우 만족합니다.
웹 구성 요소에 대한 경험을 자유롭게 공유하고 개선을 위한 아이디어를 공유하거나 인사만 해주세요 👋
Reference
이 문제에 관하여(웹 구성 요소에 래핑된 Svelte 앱), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/stefanonepa/svelte-app-wrapped-in-a-web-component-24ki텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)