🧙♂️ 诸位好,吾乃诸葛妙计,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。
📜 吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解决技术难题。
📄 吾之文章,可使汝在编程之路上,少走弯路,更上层楼,攀技术之巅峰。
🚀 若此篇文章对阁下有所裨益, 敬请👍🏻-点赞 ⭐ - 收藏 👀 - 关注
目录
一、Vue 3服务器端渲染(SSR)概述
基本概念
Vue 3中的实现方式
案例说明
二、Vue 3静态站点生成(SSG)基础
工作原理
在Vue 3中使用SSG
案例说明
三、性能对比:Vue 3 SSR vs SSG
加载时间
服务器负载
案例说明
四、SEO优化:SSR与SSG在搜索引擎优化中的角色
SSR (服务器端渲染)对SEO的影响
SSG (静态站点生成)对SEO的影响
最佳实践
五、用户体验(UX):SSR与SSG的考量
首屏加载时间
交互性
案例说明
六、缓存策略:在Vue 3 SSR和SSG中的应用
SSR中的缓存策略
SSG中的缓存策略
案例说明
七、构建与部署:SSR与SSG的流程差异
SSR项目的构建和部署
SSG项目的构建和部署
案例说明
八、动态内容处理:SSR与SSG的解决方案
SSR中处理动态内容
SSG中处理动态内容
案例说明
九、安全性考虑:SSR与SSG的安全隐患及防护
SSR的安全问题
SSG的安全问题
防护措施的案例说明
十、总结
用户体验
缓存策略
构建与部署
处理动态内容
安全问题
服务器端渲染(SSR)是一种技术,它允许JavaScript框架在服务器上生成完整的HTML页面,然后将这些页面发送到客户端。这与传统的客户端渲染(CSR)不同,在CSR中,HTML页面最初是空的,所有内容的渲染都是在浏览器中通过JavaScript完成的。
SSR的主要优势包括:
-
更快的首屏加载时间:用户可以更快地看到页面的第一屏内容,因为服务器已经预先渲染了页面。
-
更好的搜索引擎优化(SEO):由于页面内容在服务器上已经生成,搜索引擎爬虫可以更容易地抓取和索引站点内容。
-
更好的社交媒体分享:当页面被分享到社交媒体时,预渲染的HTML可以确保正确的预览图和描述。
在Vue 3中,SSR可以通过使用官方支持的SSR库或框架来实现,例如。这个库提供了将Vue组件渲染为服务器端HTML字符串的能力。
实现Vue 3 SSR的基本步骤通常包括:
-
创建Vue应用:使用方法创建一个Vue应用实例,这与客户端应用的创建方式类似,但专门用于SSR。
-
服务器设置:在Node.js服务器上设置一个服务,用于处理入站请求,并为每个请求创建新的Vue应用实例。
-
组件渲染:使用函数从将Vue应用实例渲染为HTML字符串。
-
HTML响应:将渲染好的HTML字符串作为响应发送给客户端。
-
客户端激活:客户端接收到HTML后,Vue客户端应用会"激活"这些静态标记,使其变为动态的,可以响应用户交互。
假设我们有一个简单的Vue 3应用,我们想要在服务器上渲染它。以下是一个简化的例子:
在这个例子中,我们使用了Express.js作为服务器框架。对于任何请求,我们都创建一个新的Vue应用实例,然后使用函数将其渲染为HTML字符串。最后,我们将这个HTML字符串作为响应发送给客户端。
这个简单的例子展示了Vue 3 SSR的基本概念和实现方式。在实际的生产环境中,你可能需要考虑更多的因素,比如路由、状态管理、数据预取等。
静态站点生成(SSG)是一种预渲染技术,它在构建时生成所有必要的HTML页面。与服务器端渲染(SSR)不同,SSG不需要服务器动态生成页面内容,因为所有页面在构建阶段就已经生成好了。
SSG的主要优势包括:
-
更快的加载速度:静态文件可以直接由CDN提供,减少了服务器处理时间。
-
更高的安全性:没有服务器端动态执行代码,减少了安全漏洞的风险。
-
更低的托管成本:静态文件可以托管在任何静态文件服务器上,通常成本较低。
在Vue 3中,可以使用像VitePress或VuePress这样的静态站点生成器,或者使用像Vite或Webpack这样的构建工具配合SSG插件来实现静态站点的生成。
以下是使用VuePress作为静态站点生成器的基本步骤:
-
安装VuePress:在你的Vue项目中安装VuePress作为一个依赖。
-
创建文档:按照VuePress的约定,创建Markdown文件和配置文件。
-
构建静态站点:运行VuePress构建命令,生成静态文件。
-
部署站点:将生成的静态文件部署到静态文件服务器或CDN上。
假设我们有一个Vue 3项目,并且我们想要使用VuePress来生成静态站点。以下是一个简化的例子:
首先,安装VuePress:
然后,在项目根目录下创建一个名为的文件夹,并在其中创建一个文件:
接下来,添加一个字段到你的文件中,以便能够使用npm命令来启动VuePress:
现在,你可以使用以下命令来本地运行VuePress:
当你准备好生成静态站点时,运行以下命令:
VuePress将在目录下生成静态文件。最后,你可以将这个目录的内容部署到任何静态文件托管服务,如GitHub Pages、Netlify或Vercel。
这个简单的例子展示了如何在Vue 3项目中使用VuePress进行静态站点生成。在实际的生产环境中,你可能需要配置更多的VuePress选项,添加自定义主题,或者集成其他构建工具来满足更复杂的需求。
SSR (服务器端渲染):
-
首屏加载时间通常比纯客户端渲染快,因为服务器发送的HTML页面已经包含了渲染好的内容。
-
对于动态内容丰富的应用,每次用户请求都需要服务器实时渲染页面,这可能导致延迟。
SSG (静态站点生成):
-
首屏加载时间通常非常快,因为页面是预先生成的静态HTML文件,可以直接从CDN或静态文件服务器快速提供。
-
对于所有用户,加载时间是一致的,因为每个页面都是预先生成的,没有服务器渲染的延迟。
SSR:
-
服务器负载较高,因为每个页面请求都需要服务器计算和渲染。
-
对于高流量网站,服务器可能需要更多的资源来处理并发请求,这可能需要更强大的硬件或更多的服务器实例。
SSG:
-
服务器负载较低,因为页面是静态的,服务器只需提供文件即可,不需要额外的渲染计算。
-
静态文件可以被缓存并分发到全球的CDN节点,进一步减轻原始服务器的负载。
假设我们有一个博客网站,我们可以选择使用SSR或SSG来提供内容。以下是两种情况的性能对比案例:
SSR案例:
-
我们使用Nuxt.js(Vue的SSR框架)来构建博客网站。
-
每当用户访问博客文章时,服务器都会实时渲染页面并提供给用户。
-
在流量高峰期,服务器可能会遇到性能瓶颈,因为它需要为每个请求渲染页面。
SSG案例:
-
我们使用VuePress来生成博客的静态页面。
-
所有博客文章在构建阶段就已经生成好了,并被部署到CDN上。
-
用户访问任何博客文章时,都会从最近的CDN节点快速加载静态内容。
-
服务器几乎不承受负载,因为所有请求都由CDN处理。
在这个例子中,SSG提供了更快的加载时间和更低的服务器负载。然而,如果博客需要实时更新或显示用户个性化内容,SSR可能是更好的选择,因为它可以提供动态渲染的页面。选择SSR或SSG取决于网站的具体需求,包括内容更新频率、用户个性化需求和预算等因素。
搜索引擎优化(SEO)是网站开发中的一个重要方面,它影响着网站在搜索引擎结果页(SERP)上的排名。SSR和SSG都对SEO有积极影响,但它们的工作方式略有不同。
SSR通过在服务器上生成完整的HTML页面,确保了搜索引擎爬虫在抓取网站内容时能够看到完整的页面。这对于SEO非常有利,因为:
-
完整的内容:爬虫可以立即看到完整的页面内容,包括由JavaScript动态生成的部分。
-
快速的内容索引:由于内容已经在服务器上渲染,搜索引擎可以更快地索引网站。
-
提升用户体验:快速的首屏加载时间可以减少跳出率,间接提升SEO排名。
SSG生成的静态HTML页面同样对SEO友好,因为:
-
即时可用的内容:静态页面上的内容在部署时就已经是最终形态,无需等待JavaScript执行。
-
高效的页面加载:静态页面可以快速从CDN加载,提供更好的用户体验。
-
减少服务器错误:静态页面减少了服务器运行时错误的可能性,这些错误可能会影响SEO。
无论选择SSR还是SSG,以下是一些SEO最佳实践:
-
元标签和结构化数据:确保所有页面都有适当的、标签以及结构化数据(如Schema.org),以便搜索引擎理解页面内容。
-
内容优先:在HTML中,内容应该位于前面,而不是被大量的JavaScript或样式代码所覆盖。
-
语义化的HTML标签:使用正确的HTML标签(如、、等)来帮助搜索引擎理解页面结构。
-
优化URL结构:使用清晰、描述性的URL,避免过长或含有大量参数的URL。
-
使用SSL:确保网站使用HTTPS,这是搜索引擎排名的一个因素。
-
移动友好:确保网站对移动设备友好,使用响应式设计,并通过Google的移动友好测试。
-
减少重定向:尽量减少页面重定向,因为它们可能会减慢页面加载速度并影响用户体验。
-
优化图片:确保所有图片都有属性,并对图片进行压缩以减少加载时间。
-
增强内链:在网站内部合理设置锚文本和链接,以帮助搜索引擎抓取更多页面。
-
监控和分析:使用工具如Google Search Console和Google Analytics来监控SEO表现,并根据数据进行优化。
通过遵循这些最佳实践,无论是使用SSR还是SSG,都可以提高网站的搜索引擎排名,吸引更多的访问者。
用户体验(UX)是指用户在使用产品或服务时的感受和体验。在Web开发中,SSR和SSG对用户体验有着直接的影响,特别是在首屏加载时间和页面交互性方面。
SSR (服务器端渲染):
-
SSR可以提供更快的首屏加载时间,因为服务器发送的HTML页面已经包含了渲染好的内容,用户无需等待JavaScript下载和执行即可看到页面。
-
对于需要频繁更新内容的动态网站,SSR可能会导致服务器响应时间增加,特别是在高流量情况下。
SSG (静态站点生成):
-
SSG通常提供最快的首屏加载时间,因为静态文件可以被缓存并通过CDN快速提供,无需服务器端的任何计算。
-
静态页面一旦生成,对于所有用户来说,加载时间是一致的,这提供了稳定的用户体验。
SSR:
-
虽然SSR提供了快速的首屏内容,但页面的完全交互性需要等待JavaScript下载、解析和执行完成。
-
如果JavaScript文件很大,或者客户端设备性能较差,这可能会导致用户在可视内容和可交互内容之间感受到延迟。
SSG:
-
SSG生成的页面在加载时已经是完全交互的,因为所有的HTML、CSS和JavaScript都是预先加载的。
-
对于包含大量客户端JavaScript逻辑的网站,SSG可能需要额外的客户端代码来处理页面交互,这可能会影响性能。
假设我们有一个电商平台,我们可以选择使用SSR或SSG来提供产品列表。
SSR案例:
-
我们使用Vue SSR框架(如Nuxt.js)来构建电商平台。
-
当用户访问产品列表页面时,服务器实时渲染页面并提供给用户,用户可以快速看到首屏内容。
-
但是,用户可能需要等待额外的JavaScript加载和执行,才能与页面上的元素(如添加到购物车按钮)进行交互。
SSG案例:
-
我们使用Vue SSG工具(如Gridsome)来生成电商平台的静态页面。
-
所有产品列表页面在构建时就已经生成好了,并被部署到CDN上。
-
用户访问产品列表时,页面几乎立即加载,并且可以直接与页面进行交互,因为所有的资源都已经预加载。
在这个例子中,SSG提供了更快的首屏加载时间和即时的页面交互性。然而,如果产品信息需要频繁更新,或者需要根据用户行为动态展示内容,SSR可能是更好的选择,因为它可以提供实时渲染的页面。选择SSR或SSG取决于网站的具体需求,包括内容更新频率、用户交互复杂度和性能优化等因素。
缓存是提高网站性能和用户体验的关键技术。在SSR和SSG中,有效的缓存策略可以显著减少服务器负载,加快内容交付速度,并提高网站的整体性能。
在服务器端渲染(SSR)中,页面是动态生成的,这意味着每次用户请求都需要服务器处理。为了提高性能,可以采用以下缓存策略:
-
页面级缓存:对于不经常变化的页面或页面的特定部分,可以在服务器上实现页面级缓存。这样,服务器可以直接返回缓存的HTML,而不是每次都重新渲染。
-
服务端数据缓存:如果页面依赖于数据库或API的数据,可以在服务器上缓存这些数据。这样,数据检索操作可以从缓存中快速完成,减少数据库查询。
-
CDN缓存:即使是动态内容,也可以利用CDN的边缘缓存来存储页面的副本。通过设置合适的缓存头(如),可以控制内容在CDN上的缓存时间。
-
客户端缓存:通过设置HTTP缓存头,可以让浏览器缓存静态资源(如CSS和JavaScript文件),减少后续请求的加载时间。
在静态站点生成(SSG)中,所有页面在构建时就已经生成,因此缓存策略主要集中在如何高效分发和更新这些静态资源:
-
CDN全站缓存:由于页面是静态的,可以将整个网站部署到CDN上,并充分利用CDN缓存来提供快速的全球内容交付。
-
增量构建:对于大型网站,不需要为每次更新重新生成整个站点。可以使用支持增量构建的SSG工具,只更新改变的部分。
-
浏览器缓存:为静态资源设置长期的缓存策略,直到资源内容实际发生变化。通常通过在文件名中包含内容哈希(如)来实现。
-
服务工作线程(Service Workers):可以使用Service Workers来缓存静态资源和API响应,甚至允许在离线时访问网站。
假设我们运营一个新闻网站,该网站的内容每天更新,但大部分页面结构保持不变。
SSR缓存案例:
-
我们使用Vue SSR框架(如Nuxt.js)来构建新闻网站。
-
对于首页和文章列表,我们实现了页面级缓存,这些页面每小时更新一次。
-
对于文章内容,我们使用服务端数据缓存来存储从API获取的文章数据,缓存时间设置为15分钟。
-
我们还配置了CDN来缓存静态资源,并设置了合适的头来优化客户端缓存。
SSG缓存案例:
-
我们使用Vue SSG工具(如Gridsome)来生成新闻网站的静态页面。
-
整个网站部署在CDN上,所有页面和资源都被缓存,提供快速的内容交付。
-
当新闻更新时,我们只重新生成和部署改变的页面(增量构建)。
-
我们使用Service Workers来缓存静态资源,以便即使在离线时也能访问网站。
在这两个案例中,通过合理的缓存策略,我们能够提供快速的内容加载,同时减少服务器的负载。正确的缓存策略取决于内容的更新频率、用户访问模式和技术栈。
构建过程:
-
开发环境设置:配置Node.js环境,安装依赖,编写服务端渲染逻辑。
-
应用构建:使用构建工具(如Webpack)打包客户端和服务端资源。
-
服务端渲染:在服务器上运行Node.js应用,实时渲染页面响应用户请求。
部署过程:
-
服务器准备:设置服务器环境,如安装Node.js和配置反向代理(如Nginx)。
-
持续集成/持续部署(CI/CD):配置CI/CD流程自动化测试和部署。
-
应用部署:将构建好的应用上传到服务器并启动服务。
-
监控和维护:监控应用性能,确保稳定运行,及时更新和修复问题。
挑战:
-
服务器资源管理:SSR应用可能需要更多的服务器资源,特别是在高流量情况下。
-
复杂的配置:需要配置服务器环境,管理Node.js进程,处理服务端和客户端的交互。
-
部署复杂性:实时渲染应用的部署流程可能比静态站点复杂,需要考虑负载均衡、缓存策略等。
构建过程:
-
开发环境设置:配置静态站点生成器(如VuePress或Gridsome),编写Markdown或Vue文件。
-
站点生成:运行构建命令,生成静态HTML、CSS和JavaScript文件。
-
预览和测试:在本地或临时服务器上预览生成的站点,进行测试。
部署过程:
-
静态资源托管:选择静态资源托管服务(如Netlify、Vercel或GitHub Pages)。
-
CI/CD配置:设置自动化构建和部署流程,通常与Git仓库集成。
-
内容部署:将生成的静态文件上传到托管服务,通常通过CI/CD自动完成。
-
CDN配置:配置CDN以优化全球内容交付和缓存策略。
挑战:
-
内容更新:对于需要频繁更新的内容,SSG可能需要重新构建和部署整个站点。
-
大型站点构建时间:大型静态站点的构建时间可能很长,需要优化构建过程。
-
动态功能集成:静态站点可能需要集成第三方服务或客户端JavaScript来添加动态功能。
假设我们有一个博客网站,我们可以选择使用SSR或SSG来构建和部署。
SSR案例:
-
我们使用Nuxt.js来构建博客网站,它支持SSR。
-
在本地开发环境中编写应用代码,然后使用Webpack打包资源。
-
配置CI/CD流程,在代码推送到Git仓库时自动运行测试和部署。
-
部署应用到云服务器(如AWS EC2),配置Nginx作为反向代理。
-
面临的挑战包括确保服务器性能以应对可能的流量高峰,以及维护和更新服务器环境。
SSG案例:
-
我们选择VuePress作为SSG工具来生成博客的静态页面。
-
在本地环境中编写Markdown内容,运行VuePress构建命令生成静态文件。
-
通过GitHub Actions配置CI/CD,当推送到GitHub仓库时自动构建和部署到GitHub Pages。
-
使用CDN(如Cloudflare)来优化内容交付速度和缓存静态资源。
-
面临的挑战包括管理内容更新导致的频繁构建和优化大型站点的构建时间。
在这两个案例中,SSR提供了更灵活的实时内容更新能力,但需要更多的服务器管理和资源。而SSG提供了更简单的部署流程和更快的加载速度,但对于频繁更新的内容管理可能更具挑战性。
在SSR(服务器端渲染)和SSG(静态站点生成)的上下文中,处理动态内容通常需要一些策略来确保用户体验的流畅性和内容的实时性。以下是一些处理动态内容的方法:
在SSR中,服务器在每次请求时动态生成页面,这使得它天然适合处理动态内容。但是,为了提高性能和减少服务器负载,可以采用以下策略:
客户端渲染(Hydration):
在服务器生成的静态标记上,客户端JavaScript接管以添加交互性。
动态内容(如用户评论或实时股票价格)可以在客户端通过Ajax请求获取,并在页面上实时更新。
缓存策略:
对于不经常变化的内容,可以使用服务器缓存来减少渲染次数。
对于经常变化的部分,可以通过设置较短的缓存时间或使用无缓存策略来确保内容的实时性。
SSG生成的是静态页面,因此处理动态内容通常需要客户端JavaScript或外部服务的帮助:
客户端JavaScript:
静态页面加载后,客户端JavaScript可以请求动态内容,并更新DOM。
这种方法适用于评论系统、用户个人信息、购物车等需要实时更新的场景。
预渲染
对于已知会变化但更新频率不高的内容,可以在构建时预渲染。
例如,可以在每天的特定时间运行构建过程,以更新新闻文章或博客帖子。
第三方服务:
可以集成第三方服务(如Disqus评论系统或Firebase实时数据库)来处理动态内容。
这些服务通常提供API和客户端库,可以轻松集成到静态页面中。
SSR案例: 假设我们有一个电商网站,需要显示最新的产品信息和价格。
-
使用Nuxt.js进行SSR,服务器为每个产品页面提供最新的信息。
-
对于产品价格,由于它可能会频繁变动,我们在客户端使用JavaScript请求最新价格,并在页面上动态更新。
-
对于产品描述等相对静态的内容,我们可以在服务器端渲染并缓存以提高性能。
SSG案例: 假设我们有一个新闻网站,新闻文章每天更新,但评论部分是实时的。
-
使用VuePress生成静态新闻文章页面。
-
对于评论部分,我们在客户端使用JavaScript集成第三方评论服务(如Disqus),允许用户实时发布和查看评论。
-
我们可以设置一个定时任务(如GitHub Actions workflow),每天自动运行构建过程以更新新闻内容。
在这两个案例中,SSR和SSG都能够有效地处理动态内容。SSR通过服务器端的实时渲染提供最新内容,而SSG则依赖客户端JavaScript和第三方服务来添加动态功能。选择哪种方法取决于项目的需求、内容更新频率以及对实时性的要求。
在Web开发中,无论是服务器端渲染(SSR)还是静态站点生成(SSG),都需要考虑潜在的安全问题。以下是一些常见的安全问题及其防护措施:
-
跨站脚本攻击(XSS):
-
由于SSR涉及动态生成HTML内容,如果不正确地处理用户输入,攻击者可能注入恶意脚本。
-
防护措施:对所有用户输入进行适当的转义和清理,使用模板引擎自带的XSS防护功能。
-
-
代码注入:
-
如果服务器端脚本不安全,攻击者可能通过注入恶意代码来执行未授权的操作。
-
防护措施:使用安全的编码实践,避免执行用户提供的代码片段,使用参数化查询防止SQL注入。
-
-
服务器配置错误:
-
不当的服务器配置可能导致敏感信息泄露或未授权访问。
-
防护措施:确保服务器和应用程序的配置是安全的,定期进行安全审计。
-
-
第三方依赖漏洞:
-
SSG通常依赖于大量的第三方库和插件,这些可能包含安全漏洞。
-
防护措施:定期更新依赖库,使用安全扫描工具检测已知漏洞。
-
-
内容劫持:
-
静态文件如果在传输过程中被劫持,可能会被篡改或用于恶意目的。
-
防护措施:使用HTTPS加密所有传输,确保内容的完整性。
-
-
第三方服务安全:
-
集成的第三方服务(如评论系统)可能成为攻击的途径。
-
防护措施:选择信誉良好的第三方服务提供商,定期审查集成代码。
-
SSR案例: 假设我们运营一个论坛网站,用户可以发布和评论帖子。
-
XSS防护:使用Vue.js或React等现代前端框架,它们默认对数据绑定进行转义,减少XSS风险。
-
代码注入防护:使用ORM库(如Sequelize或TypeORM)来处理数据库操作,避免直接拼接SQL语句,防止SQL注入攻击。
-
服务器配置:配置安全的HTTP头部(如Content Security Policy),限制资源加载来源,使用Nginx或Apache的安全配置模板。
SSG案例: 假设我们有一个公司介绍网站,主要提供公司信息和联系方式。
-
依赖漏洞防护:定期运行或来检查项目依赖的安全性,并及时应用更新。
-
内容劫持防护:使用Let’s Encrypt提供的免费SSL证书启用HTTPS,确保所有内容通过加密通道传输。
-
第三方服务安全:如果网站包含联系表单,使用可靠的表单处理服务(如Formspree或Netlify Forms),并启用验证码防止自动化垃圾邮件。
在这两个案例中,通过采取适当的安全措施,可以显著降低安全风险。SSR和SSG都需要持续的安全意识和定期的安全维护来保护网站免受攻击。
在本次讨论中,我们探讨了服务器端渲染(SSR)和静态站点生成(SSG)在用户体验、缓存策略、构建与部署、处理动态内容以及安全问题方面的影响和方法。
- SSR可以提供更快的首屏加载时间,但可能需要等待JavaScript加载完成后才能进行完全交互。
- SSG提供最快的首屏加载时间和即时交互性,因为静态资源可以通过CDN快速提供。
-
SSR中的缓存策略包括页面级缓存、服务端数据缓存、CDN缓存和客户端缓存。
-
SSG中的缓存策略主要依赖于CDN全站缓存、增量构建、浏览器缓存和Service Workers。
-
SSR的构建和部署涉及服务器资源管理、复杂的配置和部署流程。
-
SSG的构建和部署通常更简单,但需要管理内容更新和优化大型站点的构建时间。
-
SR天然适合处理动态内容,可以通过客户端渲染和缓存策略来优化性能。
-
SSG处理动态内容通常依赖于客户端JavaScript、预渲染和第三方服务。
-
面临的安全问题包括XSS、代码注入和服务器配置错误,需要采取相应的防护措施。
-
SSG的安全问题涉及第三方依赖漏洞、内容劫持和第三方服务安全,也需要适当的安全措施。
总的来说,SSR和SSG各有优势和挑战。选择哪一种技术取决于项目的具体需求,如内容更新频率、用户交互复杂度、性能优化需求和安全考虑。通过合理的缓存策略、构建和部署流程、动态内容处理方法以及安全措施,可以最大化地提升用户体验和网站性能。
🧙♂️ 诸位好,我是斜杠君。全栈技术,AI工作流技术研究者。分享探索AI技术等干货内容。我正在写最新版扣子(Coze)工作流教程,关注我获取最新版教程,完全免费学习。
关注公众号获取完整版教程