你真的需要试试 Astro……

更新日期: 2019-06-09阅读: 2.1k标签: 渲染

什么是 Astro?

Astro 是一个通过 JavaScript 构建静态和服务端渲染网站框架。它类似于 Next.js 和 Gatsby,而不是类似 react 这样的客户端框架。最基本的,你可以在.astro文件中定义 htmlcss 和 JS,这是一个 HTML 模板文件(但不仅仅是模板)。这个文件在构建时或每次请求时都会渲染成一个 HTML 文件,具体取决于你的渲染策略。

---
const message = "Hello, world!"
---
<html>
  <head>
    <title>My page</title>
  </head>
  <body>
    <h1>{message}</h1>
  </body>
</html>


简单概括

Astro 真正出色的地方在于,它具备构建网站所需的一切。并且以一种现代且简单的方式实现。它并不花哨或前沿,但是一切都是那么直接,不需要额外的心智负担,它就是很管用。我认为维护者做出了非常出色的努力来保持其“小而美”。

我的博客,以及 Lucia 的文档[2]都是用 Astro 构建的。使用 Astro 相当愉快。


强大的客户端 JS 支持

Astro 允许你在.astro文件中导入大多数主流框架的组件。React、vue、Svelte、SolidJS、Preact、Alpine、Lit,它们全部都可用!你可以传递 props 和 children,甚至可以配置它们的渲染方式(SSR 和 CSR)以及如何处理 hydration(加载时、可见时或者完全静态)。

---
import ReactComponent from "@components/react.tsx"
import SvelteComponent from "@components/Svelte.svelte"
import VueComponent from "@components/Vue.vue"
---

<ReactComponent/>
<SvelteComponent message="hello"/>
<VueComponent>
  <p>Some static HTML</p>
</VueComponent>

但是 Astro 中一个被低估的部分是<script/> —— 它同时支持 TypeScript 和 npm 模块!事实上,由于这个原因,我写很多客户端逻辑时会选择常规的 script 标签而不是 UI 组件。

---
---
<script>
    import { fn } from "./local";
    import package from "some-package";

    const t: string = fn();
</script>


不仅仅是静态的

尽管 Astro 的主要关注点是静态内容,但它实际上有相当不错的服务端特性,包括 api 路由、中间件和处理 cookie 的 API。它和现有的框架水平相当,甚至更好。但它没有像 React 服务器组件的 form action 那样魔术功能。归根结底,你只是在构建一个基本的 HTTP 服务,Astro 没有隐瞒这一点;它只是改善了体验。

// pages/api.ts

export const GET: APIRoute = async context => {
  const user = context.locals.user; // 在中间件中填充的对象
  const query = context.url.searchParams.get('q');
  const preference = context.cookies.get('preference');
  // ...
  return new Response();
};

通过适配器,你可以将你的网站部署到任何你想要的地方,包括 Node.js、serverless 平台和 Edge (运行在全球各地服务器上的 V8 运行时)。


.astro文件

.astro文件不仅用于表达页面,它们也是组件。你可以把它们导入为组件,并像任何其他组件系统一样传递 props 和 children。

---
import AstroComponent from "@components/Astro.astro"
---

<AstroComponent message="hello">
  <p>Some static HTML</p>
</AstroComponent>

它甚至支持 JSX!不过我还是比较喜欢像 Solid.js 中那样有工具组件来处理控制流。

---
const posts = [{
  title: "Why you should use TypeScript",
  href: "/posts/1",
}, {
  title: "Why you should avoid TypeScript",
  href: "/posts/2",
}]
---

{posts.map(post => {
  return <a href={post.href}>{post.title}</a>
})}


其他小特性

  • 内置 markdown 和 MDX 支持
  • 内置代码块和语法高亮
  • Tailwind 插件
  • 强大的插件 API
  • 动态设置 HTML 类的指令
  • RSS 包
  • 图片优化


极好的社区

Astro 社区可能是 Web 开发中最冷静、最友好的社区之一。他们不关心你喜欢 React 还是 Svelte,TypeScript 还是 JavaScript,纯 CSS 还是 Tailwind,人人生而平等。文档也是业内最佳,你可以看到他们付出了多少努力。而且它还有一个非常大的本地化团队。文档支持所有主要语言,包括日语,我也向社区贡献了一些 PR 来出一份力。

来源:ssh前端

链接: https://fly63.com/article/detial/3637

vue中数据更新变化,而页面视图未渲染的解决方案

在使用vue的时候,我们都知道它是双向数据绑定的,但是在使用不熟的情况下,经常会遇到:data中的数据变化了,但是并没有触发页面渲染。下面就整理一些出现这种情况的场景以及解决办法。

服务端渲染和客户端渲染的对比

这里结合art-template模板引擎说明。首先了解下前端页面中如何使用art-template。当不需要对SEO友好的时候,推荐使用客户端渲染;当需要对 SEO友好的时候,推荐使用服务器端渲染

解决使用vue.js未渲染前代码显示问题

在使用vue的时候,偶然发现多次刷新或者网络加载缓慢的时候,会一瞬间出现设置的模板的情况。实在很影响美观,可以使用vue现成的指令来解决这个问题:v-cloak

在微信小程序中渲染html内容的实现

大部分Web应用的富文本内容都是以HTML字符串的形式存储的,通过HTML文档去展示HTML内容自然没有问题。但是,在微信小程序(下文简称为「小程序」)中,应当如何渲染这部分内容呢?

原来 CSS 与 JS 是这样阻塞 DOM 解析和渲染的

估计大家都听过,尽量将 CSS 放头部,JS 放底部,这样可以提高页面的性能。然而,为什么呢?大家有考虑过么?很长一段时间,我都是知其然而不知其所以然,强行背下来应付考核当然可以,但实际应用中必然一塌糊涂

Vue渲染数据理解以及Vue指令

原生JS改变页面数据,必须要获取页面节点,也即是进行DOM操作,jQuery之类的框架只是简化DOM操作的写法,实质并没有改变操作页面数据的底层原理,DOM操作影响性能(导致浏览器的重绘和回流),Vue是一个mvvm框架(库),大幅度减少了DOM操作

Web渲染那些事儿

在决定渲染方式时,需要测量和理解真正的瓶颈在哪里。静态渲染或服务器渲染在多数情况都比较适用,尤其是可交互性对JS依赖较低的场景。下面是一张便捷的信息图,显示了服务器到客户端的技术频谱:

vue从后台获取数据赋值给data,如何渲染更细视图

如果从服务端返回的数据量较少,或者只有几个字段,可以用vue的set方法,如果数据量较大,请直接看第二种情况。官网API是这样介绍的:Vue.set(target,key,value)

react 异步加载数据时的渲染问题

当数据需要异步加载时render获取不到数据可能会报一些错误,此时需要在render函数中加一个判断.行到render时,state对象的haveData为false, 所以此时页面展示 loading,当异步获取数据成功时

Vue.js中v-html渲染的dom添加scoped的样式

在vue.js中,要将一段字符串渲染成html,可以使用v-html指令。但是 官方文档 中的v-html部分也提醒了

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!