ServiceStack SharpScript 未来

ServiceStack SharpScript Future

美好的一天,我使用 ServiceStack 多年,目前正在设计和计划重写 ASP MVC (Razor) 项目。 #Script似乎是一个近乎完美的契合,没有hands-on技术经验我有一些疑惑和问题。

我的问题是#Script 今天的相关性如何以及这项技术的未来计划是什么。我问这些问题是因为当我查看 GitHub 示例时,我注意到没有很多 activity,并且在互联网上搜索我也没有找到围绕它的社区。

由于 #Script's author I would say that #Script is a complete library for what it's designed for as an embeddable sandboxed .NET scripting and templating language that's ideal for exploratory programming with seamless integration into .NET APIs (including Win32 APIs) that includes a vast built-in library (1000+) of filters that's easily and highly extensible to the point that it's even able to natively support multiple languages (inc. built-in LISP Repl) within the same page that's been a joy to develop with thanks to its built-in Hot Reloading 支持在保存时立即看到更改 - 因此在技术方面 IMO 非常棒。

如果我们将它与其他语言的类似库进行比较,例如 Ruby's Liquid it should be pretty clear that #Script is vastly more capable where it scales from a user-friendly templating language to a powerful scripting language where it's capable of developing entire Windows Desktop Apps that fits in a Gist

在 activity 方面,Liquid 也是一个成熟的库,activity 只有一个 handful of commits in 2021, the difference is that it's vastly more popular and used in popular products like Jekyll as used in GitHub Pages,这确保它始终拥有丰富、充满活力的生态系统,这是最评估技术寿命的重要指标。

技术不如生态系统重要

然而,最终技术并不像它背后的用户群、社区和生态系统那么重要,而这正是 #Script 所非常缺乏的。不幸的是,这就是与 Microsoft 的默认库竞争的现实,例如专门为 .NET 推广的 Razor,并且将始终保留在 .NET 中的大部分采用。

#Script 是一个“完整”的库,因为我已经添加了我为它计划的所有功能,基本上我想不出什么可以添加到它以使其更具吸引力,但面对意识到它无限期缺乏采用我不建议将它用于大型生活(即多年)网站,因为它永远不会拥有其他生态系统所享受的社区和采用,因为社区和生态系统的好处最终是最大的继续投资于技术的重要属性。

继续积极支持

与所有 ServiceStack, #Script is still an actively supported library with no outstanding issues 一样,使用起来很安全,如果您愿意,任何问题都会得到及时解决。

网站开发建议

我认为对于较小的明确范围的项目来说,它仍然是一个不错的选择,因为它的免编译时间和热重载为服务器生成的动态页面提供了非常高效的 Dev UX。然而即便如此,我还是会首先评估像 Jekyll, Hugo or other popular static generators 这样的静态生成框架是否更合适,因为他们享有充满活力的社区,而静态生成的网站会导致性能更高、更有弹性且托管和部署网站的成本更低。

静态站点生成器

最近重新开发了具有大量静态和动态组件的 servicestack.net website to split it out into using Jekyll for static content and ServiceStack.Razor for dynamic content, my recommendation for large websites 是为其静态内容使用静态站点生成器,这有几个好处:

虽然它确实需要相当多的开销来设置,因为您有效地维护了 2 个不同的网站,但是如果静态内容被主动更新,它会大大受益,因为更改和更新静态内容的摩擦要小得多生成的站点,然后是动态站点,由于 CDN 边缘缓存,它会产生出色的最终用户 UX,从 GitHub Pages and Netlify.

等免费站点托管也更便宜

为了保留现有的 URL,我们需要静态主机无法提供的额外功能,因此我们的静态内容被部署到 S3 存储桶中,我们在其中使用 CloudFront 进行 CDN 边缘缓存,使用 CF Behaviors 将“外部静态”路由代理到我们的 .NET5 dynamic website 和一个支持漂亮 URL 的 CF 函数。对于内部部署的网站,您将能够使用反向代理和重定向规则实现类似的功能。

SPA 或剃须刀

对于无法从内容网站拆分中获益的小型网站或大部分动态网站,如果您更喜欢 C# 服务器生成的网站,我建议您使用 SPA Project Template if you prefer TypeScript and an established SPA FX like Vue, React, Svelte or Angular or Razor or MVC

渐进增强

我个人的偏好是让阅读量大的动态网站使用 ServiceStack Razor,利用 API First Development approach so that all writes are made to the same clean ServiceStack APIs that Mobile and Desktop Apps would also call. This typically involves using some kind of progressive enhancement like our Client TypeScript Validation example which utilizes the Form & Validation Binding in @servicestack/client 接管 <form> 提交以执行 TypeScript API 调用并将任何验证错误应用回表单的 UI.

Client jQuery example accomplishes the same thing without the tsc -w watched build step whose form & validation binding utilizes the older jQuery ss-utils.js library but it does mean you'd need to author logic in an older broadly ECMAScript 5 支持的 JS 版本。

#Script

的未来

因为我不希望 #Script Pages will ever achieve any meaningful adoption required for self-sustained active development, it's unlikely we'll continue in investing in further development for usage in dynamic websites (i.e. the script 项目模板),它是一个完整且可扩展的库,因此进一步开发不是绝对必要的,因为它可以使用您自己的本地插件、方法、转换器和块。但这确实意味着我们不太可能在库 OOB 中创建和包含为动态网站设计的新 methods/plugins。

仍然是一个关键的 ServiceStack 组件

#Script 仍然是 ServiceStack 的关键组件,它用于提供集成的 SPA 模板,因为它能够从 npm dev 热重载服务器中的静态 *.html 页面呈现动态网站,而这些服务器不能使用 Razor 的*.cshtml 页。这也是 ServiceStack 的 Declarative Validation possible where validation rules can be defined on dependency-free DTOs as it allows defining binary-decoupled logic in dep-free attributes. It's also what makes vuedesktop.com Desktop Apps like ServiceStack Studio possible as well as command tools like Post Command - HTTP API Command Line Utils and cross-platform dotnet scripts 使用其内部功能的原因,因此它将继续作为一个积极开发和支持的库。

#Script

的良好未来用例

但是,我会将任何#Script 的使用限制在它擅长的地方,例如作为可嵌入的脚本 .NET 沙箱,因为它比 Razor 更灵活,更适合 Rendering Emails, authoring & rendering Live Documents (e.g. if needing to maintain live user-generated reports in an RDBMS) or as an embeddable Template, JS or LISP DSL or for evaluating adhoc JS/LISP Expressions or .NET logic.

等任务

未来的替换项目模板

为了使用 ServiceStack 开发服务器生成的网站,我们正在考虑发布一些新模板,其中包含我们的最新建议(例如,采用 API 首次开发风格),如果它们能带来出色的开发效果我们关注的用户体验:

  1. 生成的集成静态(例如Hugo/Jekyll)+动态项目模板
  2. 一个 API 第一个 MVC Pages + ServiceStack 模板,具有集成的渐进增强功能

请关注 @ServiceStack,以便在它们可用时得到通知。