本帖最后由 dexteryao 于 2021-8-31 15:58 编辑
Svelte推出后一直不温不火,没有成为继Angular、React和VUE成为第四大框架,也没有失去热度无人问津。
Svelte像React和VUE一样开发,但却没有虚拟DOM,Svelte将代码编译为体积小,不依赖于框架的JS代码,这种方式看似美好但却没有得到大项目成功的实践。
在多团队完成的大项目中,各个团队可能使用不同的框架版本,甚至不同的框架,这让不同项目之间的组件复用变得不可能。“write one,run anywhere“就是一句空话。这时Svelte却变成了跨越框架鸿沟的桥梁,使用Svelte开发的无框架依赖的Web Components,可以在各个框架间复用,同时Svelte的开发方式也不像写pure js那样繁琐。
下面以SpreadJS集成为例,介绍如何用svelte开发一款spread-sheets Web Component供其他页面复用。
1. 创建Svelte template工程。
svelte 官方提供了template 工程,只要colne或者下载项目即可。 https://github.com/sveltejs/component-template
- npx degit sveltejs/component-template my-new-component
- cd my-new-component
- npm install # or yarn
复制代码 2. 修改 rollup.config.js添加 customElement: true 配置,输出为web component组件
添加后的rollup.config.js
- import svelte from 'rollup-plugin-svelte';
- import resolve from '@rollup/plugin-node-resolve';
- import pkg from './package.json';
- const name = pkg.name
- .replace(/^(@\S+\/)?(svelte-)?(\S+)/, '$3')
- .replace(/^\w/, m => m.toUpperCase())
- .replace(/-\w/g, m => m[1].toUpperCase());
- export default {
- input: 'src/index.js',
- output: [
- { file: pkg.module, 'format': 'es' },
- { file: pkg.main, 'format': 'umd', name }
- ],
- plugins: [
- svelte({
- customElement: true,
- }),
- resolve()
- ],
- };
复制代码 3. 更新 src/Component.svelte,创建spread-sheets组件
- <svelte:options tag="spread-sheets" />
- <script>
- import { createEventDispatcher, onMount } from 'svelte';
- // Event handling
- const dispatch = createEventDispatcher();
- export let value ="";
- $: valueChanged(value);
- function valueChanged(newValue) {
- console.log("value changed", newValue);
- if(spread){
- let sheet = spread.getActiveSheet();
- sheet.setValue(0, 0, value);
- }
- }
- let spreadHost;
- let spread;
- function dispatchEvent(name, e) {
- // dispatch(name, e);
- const event = new CustomEvent(name, {
- detail: e,
- bubbles: true,
- cancelable: true,
- composed: true, // this line allows the event to leave the Shadow DOM
- });
- // console.log(event)
- spreadHost.dispatchEvent(event);
- }
- onMount(() => {
- spread = new GC.Spread.Sheets.Workbook(spreadHost);
- let sheet = spread.getActiveSheet();
- sheet.setValue(0, 0, value);
- spread.bind(GC.Spread.Sheets.Events.ValueChanged, function(s, e){
- e.evnetName = "ValueChanged";
- dispatchEvent("changed", e);
- });
- spread.bind(GC.Spread.Sheets.Events.RangeChanged, function(s, e){
- e.evnetName = "RangeChanged";
- dispatchEvent("changed", e);
- });
- });
- </script>
- <style>
-
- </style>
- <div bind:this={ spreadHost} style="width: 100%; height:100%"></div>
复制代码
这样我们自定义组件就创建好了,只需要调用npm run build,就能编译出spread-sheets 组件了。
4. 在页面引用组件
创建index.html页面,并引用编译好的js文件。同时引入spreadjs相关资源
直接使用spread-sheets标签添加SpreadJS
- <!doctype html>
- <html lang="en">
- <head>
- <meta name="spreadjs culture" content="zh-cn" />
- <meta charset="utf-8" />
- <title>My Counter</title>
- <base href="/">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <link rel="stylesheet" type="text/css" href="https://demo.grapecity.com.cn/spreadjs/SpreadJSTutorial/zh/purejs/node_modules/@grapecity/spread-sheets/styles/gc.spread.sheets.excel2013white.css">
- </head>
- <body>
- <!-- <spread-sheets-designer></spread-sheets-designer> -->
- <button onclick="getJSON()">GetJSON</button>
- <spread-sheets value="123" style="display:block; width: 80%; height: 400px;"></spread-sheets>
- <script src="https://demo.grapecity.com.cn/SpreadJS/WebDesigner/lib/spreadjs/scripts/gc.spread.sheets.all.14.1.3.min.js" type="text/javascript"></script>
- <script type="text/javascript" src="/dist/index.js"></script>
- <script type="text/javascript">
- document.querySelector("spread-sheets").addEventListener("changed", function(){
- console.log(arguments)
- })
- window.onload = function(){
- document.querySelector("spread-sheets").setAttribute("value", "234");
- }
- </script>
- </body>
- </html>
复制代码
添加后效果如图
不过用Svelte 开发的Web Component也有一些限制,比如只能传递string 属性;绑定的attribute是单向绑定 ,想要获取组件内部更新值,需要绑定event获取。
如果对Svelte 感兴趣,欢迎大家评论交流
|
|