diff --git a/files/zh-cn/learn/tools_and_testing/client-side_javascript_frameworks/svelte_deployment_next/index.md b/files/zh-cn/learn/tools_and_testing/client-side_javascript_frameworks/svelte_deployment_next/index.md new file mode 100644 index 00000000000000..035e2b2846acd3 --- /dev/null +++ b/files/zh-cn/learn/tools_and_testing/client-side_javascript_frameworks/svelte_deployment_next/index.md @@ -0,0 +1,339 @@ +--- +title: 部署以及下一步 +slug: Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_deployment_next +l10n: + sourceCommit: e769461724eef53106e9e44656d95b99c4d520e5 +--- + +{{LearnSidebar}}{{PreviousMenuNext("Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_TypeScript","Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_getting_started", "Learn/Tools_and_testing/Client-side_JavaScript_frameworks")}} + +在上一篇文章中,我们了解了 Svelte 对 TypeScript 的支持,以及如何使用它使应用程序更加健壮。在本文中,我们将学习如何部署应用程序并将其发布到在线环境,并分享一些你应该继续使用的资源,以继续你的 Svelte 学习之旅。 + + + + + + + + + + + + +
前提: +

+ 建议你熟悉核心的 + HTMLCSS 和 + JavaScript 语法,并了解终端/命令行的知识。 +

+

+ 你需要安装了 Node.js 和 npm 的终端,以便编译和构建你的应用程序。 +

+
目标: + 学习如何为生产环境准备 Svelte 应用程序,并了解接下来应该访问哪些学习资源。 +
+ +## 和我们一起编写代码 + +### Git + +使用以下命令克隆 GitHub 仓库(如果尚未进行): + +```bash +git clone https://github.com/opensas/mdn-svelte-tutorial.git +``` + +然后进入当前应用程序状态的目录: + +```bash +cd mdn-svelte-tutorial/08-next-steps +``` + +或直接下载文件夹的内容: + +```bash +npx degit opensas/mdn-svelte-tutorial/08-next-steps +``` + +记得运行 `npm install && npm run dev` 来以开发模式启动应用程序。 + +## 编译我们的应用程序 + +到目前为止,我们一直在使用 `npm run dev` 命令以开发模式运行应用程序。正如我们之前所学习的,这个命令会告诉 Svelte,将我们的组件和 JavaScript 文件编译成 `public/build/bundle.js` 文件,将组件的所有 CSS 部分编译成 `public/build/bundle.css` 文件。它还会启动开发服务器并监视变化,当发生文件更改时重新编译应用程序并刷新页面。 + +生成的 `bundle.js` 和 `bundle.css` 文件大致如下(文件大小在左侧): + +```plain + 504 Jul 13 02:43 bundle.css +95981 Jul 13 02:43 bundle.js +``` + +要为生产环境编译我们的应用程序,我们需要运行 `npm run build` 命令。在这种情况下,Svelte 不会启动 Web 服务器或持续监视变化。但它会使用 [terser](https://terser.org/) 来最小化并压缩我们的 JavaScript 文件。 + +因此,在运行 `npm run build` 后,生成的 `bundle.js` 和 `bundle.css` 文件将更像这样: + +```plain + 504 Jul 13 02:43 bundle.css +21782 Jul 13 02:43 bundle.js +``` + +现在尝试在应用程序的根目录中运行 `npm run build`。你可能会收到警告,但你可以暂时忽略它。 + +现在我们整个应用程序只有 21 KB——在压缩后只有 8.3 KB。没有需要下载、解析、执行和保持在内存中运行的额外运行时或依赖项。Svelte 分析了我们的组件并将代码编译为纯 JavaScript。 + +## Svelte 编译过程的内部原理 + +默认情况下,如果你使用 `npx degit sveltejs/template my-svelte-project` 来创建一个新的应用程序,Svelte 将使用 [rollup](https://rollupjs.org/) 来打包模块。 + +> **备注:** 也有一个官方的模板使用 [webpack](https://webpack.js.org/),还有许多[由社区维护的插件](https://github.com/sveltejs/integrations#bundler-plugins)适用于其他的打包工具。 + +在 `package.json` 文件中,你可以看到 `build` 和 `dev` 脚本只是调用了 rollup: + +```json +"scripts": { + "build": "rollup -c", + "dev": "rollup -c -w", + "start": "sirv public" +}, +``` + +在 `dev` 脚本中,我们传递了 `-w` 参数,该参数告诉 rollup 监视文件变化并在文件更改时重新构建。 + +查看 `rollup.config.js` 文件,我们可以看到 Svelte 编译器只是 rollup 的一个插件: + +```js +import svelte from 'rollup-plugin-svelte'; +// … +import { terser } from 'rollup-plugin-terser'; + +const production = !process.env.ROLLUP_WATCH; + +export default { + input: 'src/main.js', + output: { + sourcemap: true, + format: 'iife', + name: 'app', + file: 'public/build/bundle.js' + }, + plugins: [ + svelte({ + // 在非生产环境中启用运行时检查 + dev: !production, + // 将所有组件的 CSS 提取到一个单独的文件中 + // 这样可以提高性能 + css: (css) => { + css.write('public/build/bundle.css'); + } + }), +``` + +在同一个文件中,你还会看到 rollup 如何在生产模式下最小化我们的脚本,以及在开发模式下启动本地服务器: + +```js + // 在开发模式下,在生成 bundle 后调用 `npm run start` + !production && serve(), + + // 监视 `public` 目录,并在非生产环境下刷新浏览器 + !production && livereload('public'), + + // 如果我们正在构建生产环境(npm run build + // 而不是 npm run dev),则进行代码压缩 + production && terser() + ], +``` + +有[许多适用于 rollup 的插件](https://github.com/rollup/awesome),可以让你自定义其行为。有一个特别有用的插件(也是由 Svelte 团队维护),叫做 [svelte-preprocess](https://github.com/sveltejs/svelte-preprocess),它可以预处理 Svelte 文件中的许多种不同的语言,如 PostCSS、SCSS、Less、CoffeeScript、SASS 和 TypeScript。 + +## 部署你的 Svelte 应用程序 + +从 Web 服务器的角度来看,Svelte 应用程序只是一堆 HTML、CSS 和 JavaScript 文件。你只需要一个能够提供静态文件的 Web 服务器,就可以运行 Svelte 应用程序,这意味着你有很多选择。让我们来看几个例子。 + +> **备注:** 下面的内容不仅适用于 Svelte 应用程序,还适用于任何需要构建步骤的客户端静态网站。 + +### 使用 Vercel 进行部署 + +部署 Svelte 应用程序的方式中,其中最简单的一种是使用 [Vercel](https://vercel.com/home)。Vercel 是一个专门为静态站点定制的云平台,它对大多数常见的前端工具都有开箱即用的支持,其中包括 Svelte。 + +要部署应用程序,请按照以下步骤进行操作。 + +1. [在 Vercel 上注册一个账户](https://vercel.com/signup)。 +2. 进入你的应用程序的根目录,并运行 `npx vercel`;第一次运行时,系统会提示你输入电子邮件地址,并按照发送到该地址的电子邮件中的步骤进行操作,以确保安全性。 +3. 再次运行 `npx vercel`,系统会提示你回答一些问题,如下所示: + + ```bash + npx vercel + ``` + + ```plain + Vercel CLI 19.1.2 + ? Set up and deploy "./mdn-svelte-tutorial"? [Y/n] y + ? Which scope do you want to deploy to? opensas + ? Link to existing project? [y/N] n + ? What's your project's name? mdn-svelte-tutorial + ? In which directory is your code located? ./ + Auto-detected Project Settings (Svelte): + - Build Command: `npm run build` or `rollup -c` + - Output Directory: public + - Development Command: sirv public --single --dev --port $PORT + ? Want to override the settings? [y/N] n + Linked to opensas/mdn-svelte-tutorial (created .vercel) + Inspect: https://vercel.com/opensas/mdn-svelte-tutorial/[...] [1s] + ✅ Production: https://mdn-svelte-tutorial.vercel.app [copied to clipboard] [19s] + Deployed to production. Run `vercel --prod` to overwrite later (https://vercel.link/2F). + To change the domain or build command, go to https://zeit.co/opensas/mdn-svelte-tutorial/settings + ``` + +4. 接受所有默认设置,这没有任何问题。 +5. 当部署完成后,在浏览器中打开“生产环境”URL,你会看到已经部署的应用! + +你还可以从 [GitHub](https://github.com/)、[GitLab](https://about.gitlab.com/) 或 [BitBucket](https://bitbucket.org/product) [导入 Svelte git 项目](https://vercel.com/import/svelte)到 Vercel 中。 + +> **备注:** 你可以通过 `npm i -g vercel` 全局安装 Vercel,这样你就不必使用 `npx` 来运行它了。 + +### 自动部署到 GitLab Pages + +对于托管静态文件,有多种在线服务允许你在每次推送代码到 git 仓库时,自动部署你的网站。大多数服务都涉及设置一个部署流水线,该流水线在每次 `git push` 时触发,负责构建和部署你的网站。 + +我们将把我们的待办事项应用部署到 [GitLab Pages](https://about.gitlab.com/stages-devops-lifecycle/pages/),借此来演示这一点。 + +1. 首先,你需要[在 GitLab 注册](https://gitlab.com/users/sign_up),然后[创建一个新项目](https://gitlab.com/projects/new)。给你的新项目取一个简短、简单的名称,比如“mdn-svelte-todo”。你将获得指向你的新 GitLab 存储库的远程 URL,例如 `git@gitlab.com:[你的用户名]/[你的项目名].git`。 +2. 在开始上传内容到你的 git 存储库之前,最好添加一个 `.gitignore` 文件来告诉 git 哪些文件应该排除在源代码控制之外。在我们的例子中,我们将在你本地项目的根文件夹中创建 `.gitignore` 文件,来排除“node_modules”目录中的内容,文件内容如下: + + ```bash + node_modules/ + ``` + +3. 现在让我们回到 GitLab。在创建新仓库后,GitLab 将向你打招呼,并解释了上传现有文件的不同选项。按照 _Push an existing folder_(推送现有文件夹)标题下的步骤进行操作: + + ```bash + cd your_root_directory # 进入项目的根文件夹 + git init + git remote add origin https://gitlab.com/[你的用户名]/mdn-svelte-todo.git + git add . + git commit -m "Initial commit" + git push -u origin main + ``` + + > **备注:** 你可以使用 [git 协议](https://git-scm.com/book/zh/v2/服务器上的-Git-协议#_git_协议)替代 `https`,它更快速,而且无需每次访问远程仓库时输入用户名和密码。要使用 git 协议,你需要[创建一个 SSH 密钥对](https://docs.gitlab.cn/jh/user/ssh.html#生成-ssh-密钥对)。你的远程仓库 URL 将是这样的:`git@gitlab.com:[你的用户名]/mdn-svelte-todo.git`。 + +按照以上步骤初始化本地 git 仓库,然后将远程仓库设置为 GitLab 上的仓库,接下来将所有文件提交到本地 git 仓库,然后将它们推送到 GitLab 上的远程仓库。 + +GitLab 使用名为 GitLab CI/CD 的内置工具来构建你的网站并将其发布到 GitLab Pages 服务器。GitLab CI/CD 运行的脚本序列用于完成这个任务,这些脚本是在名为 `.gitlab-ci.yml` 的文件中创建和修改的。配置文件中的一个特定作业叫做 `pages`,它让 GitLab 知道你正在部署一个 GitLab Pages 网站。 + +现在我们来尝试一下。 + +1. 在项目的根目录下创建 `.gitlab-ci.yml` 文件,并将以下内容复制进去: + + ```yaml + image: node:latest + pages: + stage: deploy + script: + - npm install + - npm run build + artifacts: + paths: + - public + only: + - main + ``` + + 在这里,我们告诉 GitLab 使用最新版本的 Node 镜像来构建我们的应用程序。接下来,我们声明了一个 `pages` 作业,以启用 GitLab Pages。每当我们对仓库进行推送时,GitLab 将运行 `npm install` 和 `npm run build` 来构建我们的应用程序。我们还告诉 GitLab 部署 `public` 文件夹的内容。在最后一行,我们配置 GitLab 仅在对主分支进行推送时重新部署我们的应用程序。 + +2. 由于我们的应用程序将在子目录发布(例如 `https://your-user.gitlab.io/mdn-svelte-todo`),我们需要使 `public/index.html` 文件中对 JavaScript 和 CSS 文件的引用变为相对路径。为了做到这一点,我们只需从 `/global.css`、`/build/bundle.css` 和 `/build/bundle.js` 的 URL 中去掉前面的斜杠(`/`),像这样: + + ```html + Svelte To-Do list + + + + + + + ``` + + 现在进行这个操作。 + +3. 现在,我们只需要提交并推送我们的更改到 GitLab。通过运行以下命令来完成: + + ```bash + git add public/index.html + git add .gitlab-ci.yml + git commit -m "Added .gitlab-ci.yml file and fixed index.html absolute paths" + git push + ``` + +每当有作业在运行时,GitLab 将显示一个图标,显示作业的进程。单击它以检查作业的输出。 + +![gitlab 截图显示部署的提交,该提交添加了 gitlab ci 文件,并更改了 bundle 路径为相对路径](01-gitlab-pages-deploy.png) + +你还可以从 GitLab 项目的 _CI / CD_ > _Jobs_ 菜单选项中,检查当前和之前作业的进度。 + +![在 gitlab 界面中显示的 gitlab ci 作业,运行了许多命令](02-gitlab-pages-job.png) + +一旦 GitLab 完成构建和发布你的应用程序,该应用程序将可以通过 `https://your-user.gitlab.io/mdn-svelte-todo/` 访问;在我的例子中是 `https://opensas.gitlab.io/mdn-svelte-todo/`。你可以在 GitLab 的用户界面中检查页面的 URL,具体操作请参阅 _Settings_ > _Pages_ 菜单选项。 + +通过这个配置,每当你推送更改到 GitLab 仓库,应用程序将自动重建并部署到 GitLab Pages。 + +## 进一步了解 Svelte + +在这个部分,我们将为你提供一些资源和项目,以进一步学习 Svelte。 + +### Svelte 文档 + +要深入了解 Svelte 并学习更多关于它的知识,你一定要访问 [Svelte 主页](https://svelte.dev/)。在那里,有[许多文章](https://svelte.dev/blog)解释 Svelte 的理念。如果你还没有这样做,一定要完成 [Svelte 交互式教程](https://learn.svelte.dev/)。我们已经涵盖了大部分内容,所以你不需要花费太多时间来完成它,你可以将其视为实践! + +你还可以查阅 [Svelte API 文档](https://svelte.dev/docs)和可用的[示例代码](https://svelte.dev/examples/hello-world)。 + +要了解 Svelte 作者创建它背后的动机,你应该观看 [Rich Harris](https://twitter.com/Rich_Harris) 在 YouTube 上的 [Rethinking reactivity(重新思考响应式)](https://www.youtube.com/watch?v=AdNJ3fydeao&t=47s)演讲。他是 Svelte 的创作者,所以他对此有很多见解。你还可以在这里找到交互式幻灯片,当然,这些幻灯片是使用 Svelte 构建的。如果你喜欢这个演讲,你还可以观看 Rich Harris 在 [JSCAMP 2019](https://jscamp.tech/2019/) 上的演讲 [The Return of 'Write Less, Do More'(“写的少,做的多”的回归)](https://www.youtube.com/watch?v=BzX4aTRPzno)。 + +### 相关项目 + +还有其他与 Svelte 相关的项目值得一看: + +- [Sapper](https://sapper.svelte.dev/):由 Svelte 驱动的应用程序框架,提供服务器端渲染(SSR)、代码拆分、基于文件的路由、离线支持等功能。可以将其视为 Svelte 的 [Next.js](https://nextjs.org/)。如果你计划开发相当复杂的 Web 应用程序,一定要查看这个项目。 +- [Svelte Native](https://svelte-native.technology/):由 Svelte 驱动的移动应用程序框架。可以将其视为 Svelte 的 [React Native](https://reactnative.dev/)。 +- [Svelte for VS Code](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode):官方支持的用于处理 `.svelte` 文件的 VS Code 插件,我们在我们的 [TypeScript 文章](/zh-CN/docs/Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_TypeScript)中介绍过它。 + +### 其他学习资源 + +- 在 Frontend Masters 上有一门[关于 Svelte 和 Sapper 的完整课程](https://frontendmasters.com/courses/svelte/),由 Rich Harris 提供。 +- 尽管 Svelte 是一个相对较新的项目,但网络上有很多教程和[课程](https://www.udemy.com/topic/svelte-framework/?sort=popularity)可供学习,因此很难给出推荐。 +- 然而,[Svelte.js 完全指南](https://www.udemy.com/course/sveltejs-the-complete-guide/)(Svelte.js — The Complete Guide)是由 [Academind](https://academind.com/) 提供的一个非常受欢迎且评价很高的选择。 +- [Svelte 手册](https://www.freecodecamp.org/news/the-svelte-handbook/)(The Svelte Handbook)是由 [Flavio Copes](https://flaviocopes.com/) 撰写的一本有用参考书,它可以帮助你学习 Svelte 的主要概念。 +- 如果你喜欢阅读书籍,可以阅读[《动手实践 Svelte 与 Sapper》](https://www.manning.com/books/svelte-and-sapper-in-action)(Svelte and Sapper in Action),作者是 [Mark Volkman](https://twitter.com/mark_volkmann),该书已于 2020 年 10 月出版,你可以在[网上免费预览](https://livebook.manning.com/book/svelte-and-sapper-in-action/welcome)。 +- 如果你想更深入地了解 Svelte 编译器的内部工作原理,可以阅读 [Tan Li Hau](https://twitter.com/lihautan) 的*在你的头脑中编译 Svelte(Compile Svelte in your head)*博文。这是[第一部分](https://lihautan.com/compile-svelte-in-your-head-part-1/)、[第二部分](https://lihautan.com/compile-svelte-in-your-head-part-2/)和[第三部分](https://lihautan.com/compile-svelte-in-your-head-part-3/)。 + +### 与社区互动 + +与 Svelte 社区互动并获取支持的方式有很多: + +- [svelte.dev/chat](https://discord.com/invite/yy75DKs):Svelte 的 Discord 服务器。 +- [@sveltejs](https://twitter.com/sveltejs):官方 Twitter 账号。 +- [@sveltesociety](https://twitter.com/sveltesociety):Svelte 社区的 Twitter 账号。 +- [Svelte Recipes](https://github.com/svelte-society/recipes-mvp#recipes-mvp):社区驱动的存储库,提供解决常见问题的解决方案、技巧和最佳实践。 +- [StackOverflow 上的 Svelte 相关问题](https://stackoverflow.com/questions/tagged/svelte):在 StackOverflow 上带有 `svelte` 标签的问题。 +- [Svelte Reddit 社区](https://www.reddit.com/r/sveltejs/):Svelte 社区的讨论和内容评级网站。 +- [Svelte DEV 社区](https://dev.to/t/svelte):来自 DEV.to 社区的一系列与 Svelte 相关的技术文章和教程。 + +## 完成 + +恭喜!你已经完成了 Svelte 教程。在前面的文章中,我们从对 Svelte 一无所知到构建和部署了完整应用程序。 + +- 我们了解了 Svelte 的理念,以及它与其他前端框架的区别。 +- 我们看到了如何为我们的网站添加动态行为,如何用组件组织我们的应用程序,并以不同的方式在它们之间共享信息。 +- 我们利用了 Svelte 的响应式系统,并学习了如何避免常见的陷阱。 +- 我们还了解了一些高级概念和技术,以与 DOM 元素进行交互,并使用 `use` 指令以编程方式扩展 HTML 元素的功能。 +- 然后,我们学习了如何使用 store 来处理中央数据存储库,并创建了自己的自定义 store 来将应用程序数据持久化到 Web 存储中。 +- 我们还简要介绍了 Svelte 的 TypeScript 支持。 + +在本文中,我们学习了一些零麻烦的选项,将我们的应用程序部署到生产环境,并了解了如何设置基本的流水线,在每次提交时将我们的应用程序部署到 GitLab。然后,我们为你提供了一些 Svelte 资源的列表,以便进一步学习 Svelte。 + +恭喜!完成本系列教程后,你应该具备一个坚实的基础,能够开始使用 Svelte 开发专业的 Web 应用程序。 + +{{PreviousMenuNext("Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Svelte_TypeScript","Learn/Tools_and_testing/Client-side_JavaScript_frameworks/Angular_getting_started", "Learn/Tools_and_testing/Client-side_JavaScript_frameworks")}}