<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ 网站开发 - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ freeCodeCamp 是一个免费学习编程的开发者社区，涵盖 Python、HTML、CSS、React、Vue、BootStrap、JSON 教程等，还有活跃的技术论坛和丰富的社区活动，在你学习编程和找工作时为你提供建议和帮助。 ]]>
        </description>
        <link>https://www.freecodecamp.org/chinese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ 网站开发 - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 23 May 2026 08:28:49 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/tag/website-development/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 如何使用 React 创建一个作品集网站 ]]>
                </title>
                <description>
                    <![CDATA[ 原文：How to Build a Portfolio Website with React [https://www.freecodecamp.org/news/build-portfolio-website-react/]，作者：Reed Barger [https://www.freecodecamp.org/news/author/reed/] 今天，你将为自己创建一个最重要的应用程序——你的作品集。 每个 React 开发者或者 Web 开发者通常需要向潜在的客户或者雇主展示自己能做什么。 在这篇文章里，我们将使用 React、Tailwind CSS、Netlify 等等行业标准工具创建一个作品集网站。 开始吧！ 作品集是怎样的 这是你将要建立的最终版本。 它的作用是展示你自己、你做过什么项目、你在做这些项目时用了什么技能，还有一个联系表单，以便客户或者雇主联系上你。 我们将使用什么工具  * 我们将用 React 来创建应用程序的用户界面。它将允许我们通过可重复使用的组件来组成登录页面的每一部分，以及添加我们想要的功能，例如博客。  * 为了设计我们的应 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/build-portfolio-website-react/</link>
                <guid isPermaLink="false">61de69586161280665ed7ff0</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 作品集 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 网站开发 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ luojiyin ]]>
                </dc:creator>
                <pubDate>Fri, 04 Feb 2022 05:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/01/react-portfolio-2021.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>原文：<a href="https://www.freecodecamp.org/news/build-portfolio-website-react/">How to Build a Portfolio Website with React</a>，作者：<a href="https://www.freecodecamp.org/news/author/reed/">Reed Barger</a></p><!--kg-card-begin: markdown--><p>今天，你将为自己创建一个最重要的应用程序——你的作品集。</p>
<p>每个 React 开发者或者 Web 开发者通常需要向潜在的客户或者雇主展示自己能做什么。</p>
<p>在这篇文章里，我们将使用 React、Tailwind CSS、Netlify 等等行业标准工具创建一个作品集网站。</p>
<p>开始吧！</p>
<h2 id="">作品集是怎样的</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/portfolio-1-min.gif" alt="portfolio-1-min" width="600" height="400" loading="lazy"></p>
<p>这是你将要建立的最终版本。</p>
<p>它的作用是展示你自己、你做过什么项目、你在做这些项目时用了什么技能，还有一个联系表单，以便客户或者雇主联系上你。</p>
<h2 id="">我们将使用什么工具</h2>
<ul>
<li>我们将用 React 来创建应用程序的用户界面。它将允许我们通过可重复使用的组件来组成登录页面的每一部分，以及添加我们想要的功能，例如博客。</li>
<li>为了设计我们的应用程序，我们将使用 Tailwind CSS。Tailwind 允许我们通过组合类名（classnames）将多种样式轻松应用到 React 项目上，给应用程序一个专业的外观。</li>
<li>为了把我们的应用程序部署到网络上，我们将使用免费的 Netlify。通过 CDN 的帮助下，用户可以通过我们自己的的域名快速访问到我们的项目。</li>
</ul>
<h2 id="">如何开始</h2>
<p><strong><a href="https://reedbarger.com/resources/react-portfolio-2021">你可以在这里下载我们项目的启动文件</a></strong>。</p>
<p>当你获取到代码，你要做的是把（解压好的）项目文件夹拖到代码编辑器中，然后在终端运行命令。</p>
<pre><code class="language-bash">npm install
</code></pre>
<p>然后可以开始了！</p>
<h2 id="">我需要使用什么工具来构建作品集</h2>
<p>从创建到部署应用程序，需要：</p>
<p>1、你的电脑安装 Node.js，你可以在 nodejs.org 下载安装程序。<br>
2、在你的电脑安装 Git，你可以在 git-scm.com 下载。<br>
3、我建议使用 VS Code 作为你的代码编辑器。你可以在 code.visualstudio.com 下载它。<br>
4、一个在 Netlify.com 上的免费的 Netlify 账户。<br>
5、一个免费的 GitHub 账号。</p>
<h2 id="">如何建立作品集的结构</h2>
<p>使用 React 的好处是，我们可以将我们的应用程序扩展到任意多的页面，并添加大量的内容，这是非常容易的。</p>
<p>但是，由于我们只处理一个页面，所以可以在应用程序组件中非常快速地找到需要的不同组件。我们将在顶部放一个导航栏，通过上面的链接可以跳转到作品集的不同部分。</p>
<p>然后，我们将有一个“关于”部分，这里包含我们的项目介绍、客户推荐以及联系表单。</p>
<p>这种快速的规划使我们能够弄清楚组件怎样命名，以什么顺序命名。下一步，把它们全部添加到我们的 App.js 文件夹中（在 src 文件夹）：</p>
<pre><code class="language-js">// src/App.js

import React from "react";

export default function App() {
  return (
    &lt;main&gt;
      &lt;Navbar /&gt;
      &lt;About /&gt;
      &lt;Projects /&gt;
      &lt;Skills /&gt;
      &lt;Testimonials /&gt;
      &lt;Contact /&gt;
    &lt;/main&gt;
  );
}
</code></pre>
<h2 id="">如何创建组件</h2>
<p>现在我们已经列出了所有这些组件，我们需要继续创建它们。</p>
<p>在源代码（src）文件夹中，我们将创建一个 <code>components</code> 文件夹，里面有我们需要的所有文件。</p>
<pre><code>my-portfolio
├── README.md
├── node_modules
├── package.json
├── .gitignore
├── public
│   ├── favicon.ico
│   ├── index.html
│   └── manifest.json
└── src
    ├── App.js
    ├── data.js
    ├── index.css
    ├── index.js
    └── components
        ├── About.js
        ├── Contact.js
        ├── Navbar.js
        ├── Projects.js
        ├── Skills.js
        └── Testimonials.js
</code></pre>
<p>然后我们将创建每个 React 组件的基本结构，并使用 <code>export default</code> 从该文件导出：</p>
<pre><code class="language-js">// src/components/About.js

export default function About() {}

// repeat the same basic structure for all 6 components（在所有的 6 个组件中重复相同的结构）
</code></pre>
<p>最后在 App.js 中导入它：</p>
<pre><code class="language-js">// src/App.js

import React from "react";
import About from "./components/About";
import Contact from "./components/Contact";
import Navbar from "./components/Navbar";
import Projects from "./components/Projects";
import Skills from "./components/Skills";
import Testimonials from "./components/Testimonials";

export default function App() {
  return (
    &lt;main&gt;
      &lt;Navbar /&gt;
      &lt;About /&gt;
      &lt;Projects /&gt;
      &lt;Skills /&gt;
      &lt;Testimonials /&gt;
      &lt;Contact /&gt;
    &lt;/main&gt;
  );
}
</code></pre>
<p><em>请注意，总共应该有 6 个组件</em></p>
<h2 id="tailwindcss">Tailwind CSS 介绍</h2>
<p>做完上面的，我们可以开始使用 Tailwind CSS 给我们的应用程序一个基本的外观。</p>
<p>使用 Tailwind CSS 的好处是，我们不必在 CSS 中手动编写任何样式，而是组合多个类（class）来创建我们想要的外观。</p>
<pre><code class="language-js">// src/App.js

import React from "react";
import About from "./components/About";
import Contact from "./components/Contact";
import Navbar from "./components/Navbar";
import Projects from "./components/Projects";
import Skills from "./components/Skills";
import Testimonials from "./components/Testimonials";

export default function App() {
  return (
    &lt;main className="text-gray-400 bg-gray-900 body-font"&gt;
      &lt;Navbar /&gt;
      &lt;About /&gt;
      &lt;Projects /&gt;
      &lt;Skills /&gt;
      &lt;Testimonials /&gt;
      &lt;Contact /&gt;
    &lt;/main&gt;
  );
}
</code></pre>
<h2 id="about">如何构建 <code>About</code> 组件</h2>
<p>现在开始第一部分，即 <code>about</code> 部分，介绍我们的基本情况和擅长的技能。</p>
<p>它还将包含联系表单的链接，以及我们过去的项目。由于这些链接将指向同一页面的不同部分，我们能使用 "/#projects" 和 "/#contact"。</p>
<p>为了使这些链接能跳转到每个部分，我们把项目部分 <code>id</code> 的属性设置为 <code>projects</code>，把联系部分的 <code>id</code> 属性设置为 <code>contact</code>。</p>
<pre><code class="language-js">// src/components/About.js

import React from "react";

export default function About() {
  return (
    &lt;section id="about"&gt;
      &lt;div className="container mx-auto flex px-10 py-20 md:flex-row flex-col items-center"&gt;
        &lt;div className="lg:flex-grow md:w-1/2 lg:pr-24 md:pr-16 flex flex-col md:items-start md:text-left mb-16 md:mb-0 items-center text-center"&gt;
          &lt;h1 className="title-font sm:text-4xl text-3xl mb-4 font-medium text-white"&gt;
            Hi, I'm Reed.
            &lt;br className="hidden lg:inline-block" /&gt;I love to build amazing
            apps.
          &lt;/h1&gt;
          &lt;p className="mb-8 leading-relaxed"&gt;
            Lorem ipsum dolor sit amet, consectetur adipisicing elit. Qui
            laborum quasi, incidunt dolore iste nostrum cupiditate voluptas?
            Laborum, voluptas natus?
          &lt;/p&gt;
          &lt;div className="flex justify-center"&gt;
            &lt;a
              href="#contact"
              className="inline-flex text-white bg-green-500 border-0 py-2 px-6 focus:outline-none hover:bg-green-600 rounded text-lg"&gt;
              Work With Me
            &lt;/a&gt;
            &lt;a
              href="#projects"
              className="ml-4 inline-flex text-gray-400 bg-gray-800 border-0 py-2 px-6 focus:outline-none hover:bg-gray-700 hover:text-white rounded text-lg"&gt;
              See My Past Work
            &lt;/a&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;div className="lg:max-w-lg lg:w-full md:w-1/2 w-5/6"&gt;
          &lt;img
            className="object-cover object-center rounded"
            alt="hero"
            src="./coding.svg"
          /&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/section&gt;
  );
}
</code></pre>
<p>对于本部分右侧的图片，我使用的 <code>public</code> 文件夹中的一个 svg 文件（coding.svg）。</p>
<p>这个图片只是作为一个临时的占位符，我强烈建议你使用你自己的图片。</p>
<h2 id="projects">如何构建 <code>projects</code> 组件</h2>
<p>我们的项目部分是由一个 <code>section</code> 元素组成，id为 <code>prpjects</code>。这将是包含所有项目的图片集。</p>
<pre><code class="language-js">// src/components/Projects.js

import { CodeIcon } from "@heroicons/react/solid";
import React from "react";
import { projects } from "../data";

export default function Projects() {
  return (
    &lt;section id="projects" className="text-gray-400 bg-gray-900 body-font"&gt;
      &lt;div className="container px-5 py-10 mx-auto text-center lg:px-40"&gt;
        &lt;div className="flex flex-col w-full mb-20"&gt;
          &lt;CodeIcon className="mx-auto inline-block w-10 mb-4" /&gt;
          &lt;h1 className="sm:text-4xl text-3xl font-medium title-font mb-4 text-white"&gt;
            Apps I've Built
          &lt;/h1&gt;
          &lt;p className="lg:w-2/3 mx-auto leading-relaxed text-base"&gt;
            Lorem ipsum, dolor sit amet consectetur adipisicing elit. Explicabo
            facilis repellat ab cupiditate alias vero aliquid obcaecati quisquam
            fuga dolore.
          &lt;/p&gt;
        &lt;/div&gt;
        &lt;div className="flex flex-wrap -m-4"&gt;
          {projects.map((project) =&gt; (
            &lt;a
              href={project.link}
              key={project.image}
              className="sm:w-1/2 w-100 p-4"&gt;
              &lt;div className="flex relative"&gt;
                &lt;img
                  alt="gallery"
                  className="absolute inset-0 w-full h-full object-cover object-center"
                  src={project.image}
                /&gt;
                &lt;div className="px-8 py-10 relative z-10 w-full border-4 border-gray-800 bg-gray-900 opacity-0 hover:opacity-100"&gt;
                  &lt;h2 className="tracking-widest text-sm title-font font-medium text-green-400 mb-1"&gt;
                    {project.subtitle}
                  &lt;/h2&gt;
                  &lt;h1 className="title-font text-lg font-medium text-white mb-3"&gt;
                    {project.title}
                  &lt;/h1&gt;
                  &lt;p className="leading-relaxed"&gt;{project.description}&lt;/p&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/a&gt;
          ))}
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/section&gt;
  );
}
</code></pre>
<p>注意，我们还将使用库 <code>@heroicons/react</code>，以便将 SVG 图标写成 React 组件。</p>
<p>我们从同一个文件夹中的 <code>data.js</code> 文件导入一个项目数组。在那里，我们导出一个对象数组，每个对象包含项目的数据。</p>
<pre><code class="language-js">// src/data.js

export const projects = [
  {
    title: "React Reserve",
    subtitle: "MERN Stack",
    description:
      "Lorem ipsum dolor sit amet consectetur adipisicing elit. Praesentium dolore rerum laborum iure enim sint nemo omnis voluptate exercitationem eius?",
    image: "./project-1.gif",
    link: "https://reactbootcamp.com",
  },
  {
    title: "React Tracks",
    subtitle: "React and Python",
    description:
      "Lorem ipsum dolor sit amet consectetur adipisicing elit. Praesentium dolore rerum laborum iure enim sint nemo omnis voluptate exercitationem eius?",
    image: "./project-2.gif",
    link: "https://reedbarger.com",
  },
  {
    title: "DevChat",
    subtitle: "React and Firebase",
    description:
      "Lorem ipsum dolor sit amet consectetur adipisicing elit. Praesentium dolore rerum laborum iure enim sint nemo omnis voluptate exercitationem eius?",
    image: "./project-3.gif",
    link: "https://jsbootcamp.com",
  },
  {
    title: "Epic Todo App",
    subtitle: "React Hooks",
    description:
      "Lorem ipsum dolor sit amet consectetur adipisicing elit. Praesentium dolore rerum laborum iure enim sint nemo omnis voluptate exercitationem eius?",
    image: "./project-4.gif",
    link: "https://pythonbootcamp.com",
  },
];
</code></pre>
<h2 id="skills">如何构建 <code>Skills</code> 组件</h2>
<p>我们在这部分填写自己会的技能和技术。</p>
<p>这将包含一个简单的清单，列出在我们熟悉的主要工具，可用于雇主或客户的项目中。</p>
<p>再一次，我们将从 <code>data</code> 文件夹导入一个数组。但是这个数组是由字符串组成，是我们所知道的技能，如 JavaScript、React 和 Node。</p>
<pre><code class="language-js">// src/components/Skills.js

import { BadgeCheckIcon, ChipIcon } from "@heroicons/react/solid";
import React from "react";
import { skills } from "../data";

export default function Skills() {
  return (
    &lt;section id="skills"&gt;
      &lt;div className="container px-5 py-10 mx-auto"&gt;
        &lt;div className="text-center mb-20"&gt;
          &lt;ChipIcon className="w-10 inline-block mb-4" /&gt;
          &lt;h1 className="sm:text-4xl text-3xl font-medium title-font text-white mb-4"&gt;
            Skills &amp;amp; Technologies
          &lt;/h1&gt;
          &lt;p className="text-base leading-relaxed xl:w-2/4 lg:w-3/4 mx-auto"&gt;
            Lorem ipsum dolor sit amet consectetur, adipisicing elit. Nisi sit
            ipsa delectus eum quo voluptas aspernatur accusantium distinctio
            possimus est.
          &lt;/p&gt;
        &lt;/div&gt;
        &lt;div className="flex flex-wrap lg:w-4/5 sm:mx-auto sm:mb-2 -mx-2"&gt;
          {skills.map((skill) =&gt; (
            &lt;div key={skill} className="p-2 sm:w-1/2 w-full"&gt;
              &lt;div className="bg-gray-800 rounded flex p-4 h-full items-center"&gt;
                &lt;BadgeCheckIcon className="text-green-400 w-6 h-6 flex-shrink-0 mr-4" /&gt;
                &lt;span className="title-font font-medium text-white"&gt;
                  {skill}
                &lt;/span&gt;
              &lt;/div&gt;
            &lt;/div&gt;
          ))}
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/section&gt;
  );
}
</code></pre>
<h2 id="testimonials">如何构建 <code>Testimonials</code> 组件</h2>
<p>在 <code>Testimonials</code> 组件中，我们将列出一些过去的比较熟悉的客户的推荐信。</p>
<p>这些将由几个卡片组成，里面有推荐人和推荐人所在的公司。</p>
<p>我们将导入一个包含推荐信息的数组，里面的对象包含了评价、图片和公司。</p>
<pre><code class="language-js">// src/components/Testimonials

import React from "react";
import { TerminalIcon, UsersIcon } from "@heroicons/react/solid";
import { testimonials } from "../data";

export default function Testimonials() {
  return (
    &lt;section id="testimonials"&gt;
      &lt;div className="container px-5 py-10 mx-auto text-center"&gt;
        &lt;UsersIcon className="w-10 inline-block mb-4" /&gt;
        &lt;h1 className="sm:text-4xl text-3xl font-medium title-font text-white mb-12"&gt;
          Client Testimonials
        &lt;/h1&gt;
        &lt;div className="flex flex-wrap m-4"&gt;
          {testimonials.map((testimonial) =&gt; (
            &lt;div className="p-4 md:w-1/2 w-full"&gt;
              &lt;div className="h-full bg-gray-800 bg-opacity-40 p-8 rounded"&gt;
                &lt;TerminalIcon className="block w-8 text-gray-500 mb-4" /&gt;
                &lt;p className="leading-relaxed mb-6"&gt;{testimonial.quote}&lt;/p&gt;
                &lt;div className="inline-flex items-center"&gt;
                  &lt;img
                    alt="testimonial"
                    src={testimonial.image}
                    className="w-12 rounded-full flex-shrink-0 object-cover object-center"
                  /&gt;
                  &lt;span className="flex-grow flex flex-col pl-4"&gt;
                    &lt;span className="title-font font-medium text-white"&gt;
                      {testimonial.name}
                    &lt;/span&gt;
                    &lt;span className="text-gray-500 text-sm uppercase"&gt;
                      {testimonial.company}
                    &lt;/span&gt;
                  &lt;/span&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;
          ))}
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/section&gt;
  );
}
</code></pre>
<h2 id="contact">如何构建<code>Contact</code>组件</h2>
<p>在登录页的尾部，我们将加入联系表单，以便潜在的雇主能联系到我们。</p>
<p>这个表格包含 3 个输入：姓名、电子邮件和输入信息。</p>
<p>为了接收这些表格所提交的信息，我们将使用 Netlify 表格工具以轻松保存这些信息。</p>
<pre><code class="language-js">// src/components/Contact.js

import React from "react";

export default function Contact() {
  return (
    &lt;section id="contact" className="relative"&gt;
      &lt;div className="container px-5 py-10 mx-auto flex sm:flex-nowrap flex-wrap"&gt;
        &lt;div className="lg:w-2/3 md:w-1/2 bg-gray-900 rounded-lg overflow-hidden sm:mr-10 p-10 flex items-end justify-start relative"&gt;
          &lt;iframe
            width="100%"
            height="100%"
            title="map"
            className="absolute inset-0"
            frameBorder={0}
            marginHeight={0}
            marginWidth={0}
            style={{ filter: "opacity(0.7)" }}
            src="https://www.google.com/maps/embed/v1/place?q=97+warren+st+new+york+city&amp;key=AIzaSyBFw0Qbyq9zTFTd-tUY6dZWTgaQzuU17R8"
          /&gt;
          &lt;div className="bg-gray-900 relative flex flex-wrap py-6 rounded shadow-md"&gt;
            &lt;div className="lg:w-1/2 px-6"&gt;
              &lt;h2 className="title-font font-semibold text-white tracking-widest text-xs"&gt;
                ADDRESS
              &lt;/h2&gt;
              &lt;p className="mt-1"&gt;
                97 Warren St. &lt;br /&gt;
                New York, NY 10007
              &lt;/p&gt;
            &lt;/div&gt;
            &lt;div className="lg:w-1/2 px-6 mt-4 lg:mt-0"&gt;
              &lt;h2 className="title-font font-semibold text-white tracking-widest text-xs"&gt;
                EMAIL
              &lt;/h2&gt;
              &lt;a className="text-indigo-400 leading-relaxed"&gt;
                reedbarger@email.com
              &lt;/a&gt;
              &lt;h2 className="title-font font-semibold text-white tracking-widest text-xs mt-4"&gt;
                PHONE
              &lt;/h2&gt;
              &lt;p className="leading-relaxed"&gt;123-456-7890&lt;/p&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;form
          netlify
          name="contact"
          className="lg:w-1/3 md:w-1/2 flex flex-col md:ml-auto w-full md:py-8 mt-8 md:mt-0"&gt;
          &lt;h2 className="text-white sm:text-4xl text-3xl mb-1 font-medium title-font"&gt;
            Hire Me
          &lt;/h2&gt;
          &lt;p className="leading-relaxed mb-5"&gt;
            Lorem ipsum dolor sit amet consectetur, adipisicing elit. Illum
            suscipit officia aspernatur veritatis. Asperiores, aliquid?
          &lt;/p&gt;
          &lt;div className="relative mb-4"&gt;
            &lt;label htmlFor="name" className="leading-7 text-sm text-gray-400"&gt;
              Name
            &lt;/label&gt;
            &lt;input
              type="text"
              id="name"
              name="name"
              className="w-full bg-gray-800 rounded border border-gray-700 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-900 text-base outline-none text-gray-100 py-1 px-3 leading-8 transition-colors duration-200 ease-in-out"
            /&gt;
          &lt;/div&gt;
          &lt;div className="relative mb-4"&gt;
            &lt;label htmlFor="email" className="leading-7 text-sm text-gray-400"&gt;
              Email
            &lt;/label&gt;
            &lt;input
              type="email"
              id="email"
              name="email"
              className="w-full bg-gray-800 rounded border border-gray-700 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-900 text-base outline-none text-gray-100 py-1 px-3 leading-8 transition-colors duration-200 ease-in-out"
            /&gt;
          &lt;/div&gt;
          &lt;div className="relative mb-4"&gt;
            &lt;label
              htmlFor="message"
              className="leading-7 text-sm text-gray-400"&gt;
              Message
            &lt;/label&gt;
            &lt;textarea
              id="message"
              name="message"
              className="w-full bg-gray-800 rounded border border-gray-700 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-900 h-32 text-base outline-none text-gray-100 py-1 px-3 resize-none leading-6 transition-colors duration-200 ease-in-out"
            /&gt;
          &lt;/div&gt;
          &lt;button
            type="submit"
            className="text-white bg-indigo-500 border-0 py-2 px-6 focus:outline-none hover:bg-indigo-600 rounded text-lg"&gt;
            Submit
          &lt;/button&gt;
        &lt;/form&gt;
      &lt;/div&gt;
    &lt;/section&gt;
  );
}
</code></pre>
<h2 id="googlemaps">如何嵌入 <code>Google Maps</code> 位置</h2>
<p>在表格的左边，我们将一个 <code>Google Maps</code> 嵌入，显示我们的所在位置。</p>
<p>我们可以在一个在线工具（embed-map.com）的帮助下这样做。你所要做的事只是输入你的位置并点击<code>Generate HTML code</code>。</p>
<p>在给我们生成的代码中，不要复制所有的代码，只要复制 ifame 中的 <code>src</code> 属性，然后替换掉 <code>src</code> 的默认值。<br>
<img src="https://www.freecodecamp.org/news/content/images/2021/06/portfolio-2.png" alt="portfolio-2" width="600" height="400" loading="lazy"></p>
<p>向 Netlify 发送任何提交的表单数据，Netlify Forms 需要将从静态 HTML 中识别表单。因为我们的 React 应用是由 JavaScript 控制的，而不是普通的 HTML 组成，所以我们需要在 <code>public</code> 文件夹下的 index.html 文件中添加一个隐藏的表单。</p>
<pre><code class="language-html">&lt;!-- public/index.html --&gt;

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
  &lt;head&gt;
    &lt;!-- head content skipped --&gt;
  &lt;/head&gt;
  &lt;body&gt;

  &lt;form name="contact" netlify netlify-honeypot="bot-field" hidden&gt;
    &lt;input type="text" name="name" /&gt;
    &lt;input type="email" name="email" /&gt;
    &lt;textarea name="message"&gt;&lt;/textarea&gt;
  &lt;/form&gt;
  
    &lt;noscript&gt;You need to enable JavaScript to run this app.&lt;/noscript&gt;
    &lt;div id="root"&gt;&lt;/div&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre>
<p>我们需要隐藏这个表单，因为它不需要被用户看到，它只需要被Netlify看到。</p>
<h2 id="">如何从联系表单提交</h2>
<p>完成上面这些，我们将回到 Contact.js。我们将使用 JavaScript 提交这个表单。</p>
<pre><code class="language-js">const [name, setName] = React.useState("");
const [email, setEmail] = React.useState("");
const [message, setMessage] = React.useState("");
</code></pre>
<p>我们将在 <code>onChange</code> 处理程序的帮助下，将用户在每个输入项的信息存储在 <code>state</code>。</p>
<pre><code class="language-js">// src/components/Contact.js

import React from "react";

export default function Contact() {
  const [name, setName] = React.useState("");
  const [email, setEmail] = React.useState("");
  const [message, setMessage] = React.useState("");

  function encode(data) {
    return Object.keys(data)
      .map(
        (key) =&gt; encodeURIComponent(key) + "=" + encodeURIComponent(data[key])
      )
      .join("&amp;");
  }

  function handleSubmit(e) {
    e.preventDefault();
    fetch("/", {
      method: "POST",
      headers: { "Content-Type": "application/x-www-form-urlencoded" },
      body: encode({ "form-name": "contact", name, email, message }),
    })
      .then(() =&gt; alert("Message sent!"))
      .catch((error) =&gt; alert(error));
  }

  return (
    &lt;section id="contact" className="relative"&gt;
      &lt;div className="container px-5 py-10 mx-auto flex sm:flex-nowrap flex-wrap"&gt;
        &lt;div className="lg:w-2/3 md:w-1/2 bg-gray-900 rounded-lg overflow-hidden sm:mr-10 p-10 flex items-end justify-start relative"&gt;
          &lt;iframe
            width="100%"
            height="100%"
            title="map"
            className="absolute inset-0"
            frameBorder={0}
            marginHeight={0}
            marginWidth={0}
            style={{ filter: "opacity(0.7)" }}
            src="https://www.google.com/maps/embed/v1/place?q=97+warren+st+new+york+city&amp;key=AIzaSyBFw0Qbyq9zTFTd-tUY6dZWTgaQzuU17R8"
          /&gt;
          &lt;div className="bg-gray-900 relative flex flex-wrap py-6 rounded shadow-md"&gt;
            &lt;div className="lg:w-1/2 px-6"&gt;
              &lt;h2 className="title-font font-semibold text-white tracking-widest text-xs"&gt;
                ADDRESS
              &lt;/h2&gt;
              &lt;p className="mt-1"&gt;
                97 Warren St. &lt;br /&gt;
                New York, NY 10007
              &lt;/p&gt;
            &lt;/div&gt;
            &lt;div className="lg:w-1/2 px-6 mt-4 lg:mt-0"&gt;
              &lt;h2 className="title-font font-semibold text-white tracking-widest text-xs"&gt;
                EMAIL
              &lt;/h2&gt;
              &lt;a className="text-indigo-400 leading-relaxed"&gt;
                reedbarger@email.com
              &lt;/a&gt;
              &lt;h2 className="title-font font-semibold text-white tracking-widest text-xs mt-4"&gt;
                PHONE
              &lt;/h2&gt;
              &lt;p className="leading-relaxed"&gt;123-456-7890&lt;/p&gt;
            &lt;/div&gt;
          &lt;/div&gt;
        &lt;/div&gt;
        &lt;form
          netlify
          name="contact"
          onSubmit={handleSubmit}
          className="lg:w-1/3 md:w-1/2 flex flex-col md:ml-auto w-full md:py-8 mt-8 md:mt-0"&gt;
          &lt;h2 className="text-white sm:text-4xl text-3xl mb-1 font-medium title-font"&gt;
            Hire Me
          &lt;/h2&gt;
          &lt;p className="leading-relaxed mb-5"&gt;
            Lorem ipsum dolor sit amet consectetur, adipisicing elit. Illum
            suscipit officia aspernatur veritatis. Asperiores, aliquid?
          &lt;/p&gt;
          &lt;div className="relative mb-4"&gt;
            &lt;label htmlFor="name" className="leading-7 text-sm text-gray-400"&gt;
              Name
            &lt;/label&gt;
            &lt;input
              type="text"
              id="name"
              name="name"
              className="w-full bg-gray-800 rounded border border-gray-700 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-900 text-base outline-none text-gray-100 py-1 px-3 leading-8 transition-colors duration-200 ease-in-out"
              onChange={(e) =&gt; setName(e.target.value)}
            /&gt;
          &lt;/div&gt;
          &lt;div className="relative mb-4"&gt;
            &lt;label htmlFor="email" className="leading-7 text-sm text-gray-400"&gt;
              Email
            &lt;/label&gt;
            &lt;input
              type="email"
              id="email"
              name="email"
              className="w-full bg-gray-800 rounded border border-gray-700 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-900 text-base outline-none text-gray-100 py-1 px-3 leading-8 transition-colors duration-200 ease-in-out"
              onChange={(e) =&gt; setEmail(e.target.value)}
            /&gt;
          &lt;/div&gt;
          &lt;div className="relative mb-4"&gt;
            &lt;label
              htmlFor="message"
              className="leading-7 text-sm text-gray-400"&gt;
              Message
            &lt;/label&gt;
            &lt;textarea
              id="message"
              name="message"
              className="w-full bg-gray-800 rounded border border-gray-700 focus:border-indigo-500 focus:ring-2 focus:ring-indigo-900 h-32 text-base outline-none text-gray-100 py-1 px-3 resize-none leading-6 transition-colors duration-200 ease-in-out"
              onChange={(e) =&gt; setMessage(e.target.value)}
            /&gt;
          &lt;/div&gt;
          &lt;button
            type="submit"
            className="text-white bg-indigo-500 border-0 py-2 px-6 focus:outline-none hover:bg-indigo-600 rounded text-lg"&gt;
            Submit
          &lt;/button&gt;
        &lt;/form&gt;
      &lt;/div&gt;
    &lt;/section&gt;
  );
}
</code></pre>
<p>正如你在上面看到的，我们正在用一个特殊的<code>encode</code>(编码)函数对表单数据进行编码。</p>
<h2 id="navbar">如何构建 <code>Navbar</code> 组件</h2>
<p>最后一步是构建我们的 <code>Navbar</code> 组件。</p>
<pre><code class="language-js">// src/components/Navbar.js

import { ArrowRightIcon } from "@heroicons/react/solid";
import React from "react";

export default function Navbar() {
  return (
    &lt;header className="bg-gray-800 md:sticky top-0 z-10"&gt;
      &lt;div className="container mx-auto flex flex-wrap p-5 flex-col md:flex-row items-center"&gt;
        &lt;a className="title-font font-medium text-white mb-4 md:mb-0"&gt;
          &lt;a href="#about" className="ml-3 text-xl"&gt;
            Reed Barger
          &lt;/a&gt;
        &lt;/a&gt;
        &lt;nav className="md:mr-auto md:ml-4 md:py-1 md:pl-4 md:border-l md:border-gray-700	flex flex-wrap items-center text-base justify-center"&gt;
          &lt;a href="#projects" className="mr-5 hover:text-white"&gt;
            Past Work
          &lt;/a&gt;
          &lt;a href="#skills" className="mr-5 hover:text-white"&gt;
            Skills
          &lt;/a&gt;
          &lt;a href="#testimonials" className="mr-5 hover:text-white"&gt;
            Testimonials
          &lt;/a&gt;
        &lt;/nav&gt;
        &lt;a
          href="#contact"
          className="inline-flex items-center bg-gray-800 border-0 py-1 px-3 focus:outline-none hover:bg-gray-700 rounded text-base mt-4 md:mt-0"&gt;
          Hire Me
          &lt;ArrowRightIcon className="w-4 h-4 ml-1" /&gt;
        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/header&gt;
  );
}
</code></pre>
<p>如何在较大的设备上将 <code>Navbar</code> 组件在页面的顶部显示？我们将使用 <code>md:sticky</code> 类添加到 <code>header</code> 元素。</p>
<h2 id="">如何部署作品集</h2>
<p>现在，为了使我们的作品集上线，我们需要把应用程序推送到 GitHub。</p>
<p>一旦你熟悉了这个流程，我们可以首先创建一个新的 GitHub 仓库。之后，我们将运行 <code>git add .</code>、<code>git commit -m "Deploy"</code>，创建 git 远程，然后 <code>git push -u orgin master</code>。</p>
<p>一旦我们的项目建立在 GitHub 上，我们就可以去 Netlify，选择 <code>Choose Site from Git</code>。然后选择 GitHub 作为持续部署，并选择我们刚刚推送代码的 GitHub 仓库。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/portfolio-3-min.gif" alt="portfolio-3-min" width="600" height="400" loading="lazy"></p>
<p>之后，我们的项目将自动部署到网络上！</p>
<h2 id="">下一步是什么</h2>
<p>祝贺你，你现在可以通过一个在线的作品集应用程序向潜在雇主展示你的所有项目和技能了！</p>
<p>下一步要做的事设置一个自己的域名，最好用你的名字（例如 <a href="https://reedbarger.com/">reedbarger.com</a>）。</p>
<p>由于 Netlify 包含一个 DNS，你可以很容易在那里设置一个自己的域名。</p>
<p>可以考虑在你的 React 应用程序中添加一个博客，向潜在的雇主展示你更多的开发知识。</p>
<p>通过个人作品集表达你自己以及你作为开发者的热情所在，你将获得成功！</p>
<h2 id="react">获得学习 React 的方法</h2>
<p><strong><a href="http://bit.ly/join-react-bootcamp">The React Bootcamp</a></strong> 有你应该学习的 React 的所有知识，里面有视频、手册，还有特别的奖金。</p>
<p>数百位开发人员已经在这里掌握 React，找到他们梦想的工作，并掌握他们的未来</p>
<p><a href="http://bit.ly/join-react-bootcamp"><img src="https://reedbarger.nyc3.digitaloceanspaces.com/react-bootcamp-banner.png" alt="The React Bootcamp" width="600" height="400" loading="lazy"></a><br>
<em>点击这里，当它开放时，你将得到通知</em></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 内容型网站后端一把梭 ]]>
                </title>
                <description>
                    <![CDATA[ Web 全栈工程师经常遇到一些内容型网站的开发需求，比如个人博客、机构官网、新闻门户。这些虽是 Web 1.0、2.0 时代就烂大街的典型 Web-site，但面对不同的甲方，看似雷同的需求往往又有各种细节的定制化。 虽然 WordPress、Discuz!X 等建站系统早已非常成熟，但在人们更看重 UI/UX 设计的今天，它们专用的模板引擎 反而成了二次开发最大的障碍。只要是近两年做过Web 前端开发的同学就知道，不能利用基于 Node.js 的现代化工具链的项目，开发起来有多蛋疼。 Web 前后端分离催生了 Web 前端岗位，也让WordPress [https://wordpress.org/]、Ghost [https://ghost.org/] 这些老牌 CMS 系统开放了RESTful API。但有的开源项目做得更加激进 ——Headless CMS [https://github.com/search?q=Headless+CMS&ref=opensearch]，前台界面都省了，只有后端 API 和后台界面 ，普通用户看啥你们自己写~ 这其中最为优秀的便是Strap ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/cms-back-end-setting/</link>
                <guid isPermaLink="false">5ef84f38db4be8080eb70f0e</guid>
                
                    <category>
                        <![CDATA[ 网站开发 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ TechQuery ]]>
                </dc:creator>
                <pubDate>Sun, 31 Jan 2021 07:20:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/06/1593331926583.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong>Web 全栈工程师</strong>经常遇到一些<strong>内容型网站</strong>的开发需求，比如个人博客、机构官网、新闻门户。这些虽是 Web 1.0、2.0 时代就烂大街的典型 Web-site，但面对不同的甲方，看似雷同的需求往往又有各种细节的定制化。</p><p>虽然 WordPress、Discuz!X 等<strong>建站系统</strong>早已非常成熟，但在人们更看重 UI/UX 设计的今天，它们专用的<strong>模板引擎</strong>反而成了二次开发最大的障碍。只要是近两年做过 &nbsp;<strong>Web 前端开发</strong>的同学就知道，不能利用<strong>基于 Node.js 的现代化工具链</strong>的项目，开发起来有多蛋疼。</p><p><strong>Web 前后端分离</strong>催生了 Web 前端岗位，也让 &nbsp;<a href="https://wordpress.org/">WordPress</a>、<a href="https://ghost.org/">Ghost</a> &nbsp;这些老牌 CMS 系统开放了 &nbsp;<strong>RESTful API</strong>。但有的开源项目做得更加激进 —— &nbsp;<a href="https://github.com/search?q=Headless+CMS&amp;ref=opensearch">Headless CMS</a>，前台界面都省了，只有<strong>后端 API</strong> &nbsp;和<strong>后台界面</strong>，普通用户看啥你们自己写~</p><p>这其中最为优秀的便是 &nbsp;<a href="https://strapi.io/">Strapi</a>，因为它的后台设计不局限于传统的博客、门户，而是：</p><ol><li><strong>数据模型</strong>灵活可配置（可用 Git 管理 JSON 配置文件）</li><li>RESTful API 完全支持 &nbsp;<strong>CRUD</strong>（增删查改）和 &nbsp;<strong>RBAC</strong>（角色权限）</li><li>自身是个标准的 &nbsp;<strong>Node.js 后端项目</strong>，并有留有二次开发接口</li><li>包括 &nbsp;<a href="https://swagger.io/">Swagger</a> &nbsp;Documentation 在内的插件生态</li></ol><p>这使得它既像 BaaS 中的 &nbsp;<a href="https://leancloud.cn/">LeanCloud</a>，又像 Python 开发框架 &nbsp;<a href="https://www.djangoproject.com/">Django</a>，在<strong>简单易用</strong>的同时，又不束缚专业开发者。</p><figure class="kg-card kg-image-card"><img src="https://tech-query.me/development/headless-cms-strapi/Strapi-admin.png" class="kg-image" alt="Strapi-admin" width="600" height="400" loading="lazy"></figure><h2 id="-">本地开发</h2><h3 id="--1">创建项目</h3><p>以下命令会一键<strong>创建项目骨架</strong>、<strong>安装依赖包</strong>、<strong>启动开发模式</strong>：</p><pre><code class="language-shell">npm init strapi-app ~/my-project --quickstart
</code></pre><h3 id="--2">开发模式启动</h3><p>下次继续开发时，则执行以下命令：</p><pre><code class="language-shell">cd ~/my-project
npm run develop
</code></pre><p>如果执行 &nbsp;<code>npm start</code>，启动的后台系统只能添加数据，不能修改数据结构，是<strong>线上生产</strong>模式。</p><h3 id="--3">创建代码库</h3><p><a href="https://github.com/new">在 GitHub 上创建代码库</a>后，把生成的代码传上去：</p><pre><code class="language-shell">git init
git remote add origin https://github.com/my-id/my-project.git
git add .
git commit -m "[add] Strapi framework"
git push
</code></pre><h2 id="--4">服务器部署</h2><p>下面以 Linux (Ubuntu 18.04) 为例，简介线上部署。</p><h3 id="--5">安装容器环境</h3><pre><code class="language-shell"># 安装 Docker
curl -fsSL https://get.docker.com | sh
# 安装 Python pip
apt install python-pip
# 安装 Docker Compose
pip install docker-compose
</code></pre><h3 id="-git">初始化 Git</h3><p>为了后面<strong>自动化部署</strong>的方便，需要生成好 &nbsp;<strong>SSH 密钥对</strong>：</p><pre><code class="language-shell"># 生成 SSH Key
ssh-keygen -t rsa -b 4096 -C "my_email@example.com"

cd ~/.ssh
添加 SSH Key 私钥
ssh-add id_rsa
信任 SSH Key 公钥

</code></pre><p>并将上述公钥添加到 &nbsp;<code>[https://github.com/my-id/my-project/settings/keys][16]</code> &nbsp;页面。</p><p>如此，便可无需用户名、密码，直接克隆代码库：</p><pre><code class="language-shell">git clone git@github.com:my-id/my-project.git /var/www
</code></pre><h3 id="--6">部署配置文件</h3><p>将以下两个文件放在代码库相应路径中，并提交：</p><h4 id="docker-">Docker 服务编排</h4><p><code>~/my-project/docker-compose.yml</code></p><pre><code class="language-yaml">version: '3'

</code></pre><p>以上配置的是最简单的 &nbsp;<a href="https://www.sqlite.org/">SQLite</a> &nbsp;数据库，小型网站完全足够。</p><h4 id="github-actions-">GitHub Actions 持续部署</h4><p>以下配置让我们无需每次更新 Strapi 配置、代码时，登录服务器手动部署新版本：</p><p><code>~/my-project/.github/workflows/main.yml~</code></p><pre><code class="language-yaml">name: Deploy Server
on:
  push:
    branches:
      - master
jobs:
  SSH:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@master
      - name: Deploy
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: root
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /var/www
            git fetch --all
            git reset --hard
            git pull
            docker-compose down
            docker-compose up -d
</code></pre><p>【注意】在推送代码前，务必去 &nbsp;<code>[https://github.com/my-id/my-project/settings/secrets][22]</code> &nbsp;页面创建好上述配置中的变量：</p><p>名称内容<code>HOST</code>服务器 &nbsp;<strong>IP 地址</strong><code>SSH_KEYssh-keygen</code> &nbsp;命令生成的<strong>私钥</strong>，通常存在 &nbsp;<code>/.ssh/id_rsa</code></p><h2 id="--7">总结</h2><p>经过前面的一顿折腾，<strong>开发者</strong>只需在本机浏览器中点点鼠标、轻敲键盘，就能实现<strong>网站数据结构</strong>的设计；推送代码到 GitHub，就能实现网站后台的更新。而<strong>运营专员</strong>访问的线上后台锁定了数据结构，他们只能在现有数据表中添加具体数据。这样一来，面对单纯的数据存取，<strong>后端 API</strong> 和<strong>后台 UI</strong> 都不用开发了~</p><p>欢迎访问我的<a href="https://tech-query.me/">更多文章</a>。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 我在新冠肺炎疫情期间学习编程，开发了一个数千人使用的网站 ]]>
                </title>
                <description>
                    <![CDATA[ 起因 因为 COVID-19  新冠肺炎疫情的传播，我们公司要求员工在 2020 年 3 月初在家工作。 起初，从传统的办公室环境到远程工作的转变是惊人的：在纽约市，我没有一个舒适的工作区，在那里我可以写代码、写代码，或者做主动任务。 日子一天天过去，我已经尽力做出调整，而且和我的许多同事一样，我也花了大量时间寻找方法来适应新的程序。 好好利用这个机会，我经常提醒自己。 由于纽约 COVID-19 新冠肺炎疫情的流行，我知道我会在家里呆上好几个月。它让我想到了一个主意：我挑战自己，学习新的技能。在我看来，学些有挑战性的、与众不同的东西会是一件很愉快的事，也是一种非常需要的可靠的分散注意力的方式。 我花了些时间思考我要学什么。随后我进行了研究，并提出了一些我认为可以在隔离期开发的技能，这些技能满足以下条件：  * 学习技能应该是有趣的  * 一旦学会，我就应该在生活中更广泛地使用它  * 它应该帮助我创建对他人有用或有价值的东西  * 最后，我应该通过在线自学来学习这些技能 根据这些指导和我的能力圈，我列出了一些我想要深入了解的东西。 第一份清单是：  * 学习弹吉他  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/why-i-got-hooked-creating-a-website-in-a-new-market/</link>
                <guid isPermaLink="false">5f745ebb027c3105323f567e</guid>
                
                    <category>
                        <![CDATA[ 网站开发 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 自我提升 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 远程工作 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp.org ]]>
                </dc:creator>
                <pubDate>Wed, 30 Sep 2020 10:59:41 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/09/website-launch-1-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="-">起因</h2><p>因为 COVID-19<strong> </strong>新冠肺炎疫情的传播，我们公司要求员工在 2020 年 3 月初在家工作。</p><p>起初，从传统的办公室环境到远程工作的转变是惊人的：在纽约市，我没有一个舒适的工作区，在那里我可以写代码、写代码，或者做主动任务。</p><p>日子一天天过去，我已经尽力做出调整，而且和我的许多同事一样，我也花了大量时间寻找方法来适应新的程序。</p><p>好好利用这个机会，我经常提醒自己。</p><p>由于纽约 COVID-19 新冠肺炎疫情的流行，我知道我会在家里呆上好几个月。它让我想到了一个主意：我挑战自己，学习新的技能。在我看来，学些有挑战性的、与众不同的东西会是一件很愉快的事，也是一种非常需要的可靠的分散注意力的方式。</p><p>我花了些时间思考我要学什么。随后我进行了研究，并提出了一些我认为可以在隔离期开发的技能，这些技能满足以下条件：</p><ul><li>学习技能应该是有趣的</li><li>一旦学会，我就应该在生活中更广泛地使用它</li><li>它应该帮助我创建对他人有用或有价值的东西</li><li>最后，我应该通过在线自学来学习这些技能</li></ul><p>根据这些指导和我的能力圈，我列出了一些我想要深入了解的东西。</p><p>第一份清单是：</p><ul><li>学习弹吉他</li><li>成为一名能胜任的业余厨师，能烹调各种营养食物</li><li>提高我在中国留学时的普通话水平</li><li>创建一个或多或少是从头开始的网站，帮助像我一样的人在家里工作</li></ul><p>在和朋友们讨论和看过各种在线教程后，我选择建立了自己的第一个网站。立刻，我被迷住了。</p><p>我从中学到了很多，现在我想和大家分享几门核心课程。</p><p>随着 <a href="https://wfhadviser.com/">WFHAdviser.com</a> 网站的开发，我的故事还没有完成，我每周会学到更多。</p><p>网上有很多资源，内容包括如何创建网站或者通过博客赚钱。当然这篇文章不是目的。</p><p>我想先强调一下我已经认识到的一些更高层次的知识，你应该知道的，然后才是你自己的网站项目。</p><h2 id="-1-">收获 1：创建网站时，请围绕你感兴趣的主题</h2><p>在我开始创建 WFHAdviser.com 的时候，我实际上是在创建一个在线资源，它可以帮助我解决一些我非常清楚的问题。</p><p>尽管流量不大，但我的想法是可行的，这个网站对于我和一些正在努力解决下列基本问题的同事来说仍然是有用的：</p><ul><li>在远距离工作的时候，如何与他们讨论新的福利和好处</li><li>怎样在预算范围内建立家庭办公室</li><li>如何减轻压力或者在卧室工作时保持舒适的姿势？</li></ul><p>我发现创建网站内容的过程非常有意义。</p><p>写这篇文章不仅很有意思，而且我还需要更多地了解人们所关心的，以及他们在家庭办公环境中所面临的挑战。</p><p>我做了定性研究，给朋友打电话，和他们谈谈他们是如何处理远程工作的。为了更好地理解人们在网上搜索什么，我做了定量研究和搜索查询趋势调查。</p><p>这一过程非常艰苦。在夜间和周末，努力从家庭空间获取更多关于工作的信息。我把这些学习成果变成了内容，然后把它们分享给生活中的重要人物(朋友、家人、伙伴)。他们再次和其他人分享我的网站。</p><p>我从我的朋友或前同事的朋友那里得到关于我的博客是如何帮助他们在家里成功工作的邮件和信息，这促使我建立更多资源、指南和内容来帮助这些读者。</p><p>所以，如果你想建立一个网站，一定要在垂直方向上建立网站。花费一些时间来理解你要构建的内容，以及为什么要这样做，并确保数字指纹的细节显示：站点的内容、外观和服务对象的所有权。</p><p>飞轮从热情开始。对一些人来说，也许会在 <a href="https://livingbettercbd.com/">CBD</a> 或者更多的<a href="https://hostingfacts.com/best-cdn-providers/">技术内容发布</a>平台找到激情。有可能存在的表是无限的。对于我来说，就是在家办公。</p><h2 id="-2-">收获 2：速度很重要，所以要迅速行动</h2><p>这个网站的第一版最多只能说是草率。把它称为带有一些链接的漂亮的登录页面是非常大方的。站点缺少我想要包括的功能，但无法在启动时完成。</p><p>有些我的博客内容需要编辑，但是我还是把它们放到了网站上。很遗憾，有些链接导致了 404 错误。</p><p>为什麽在发布时我会坦率地分享网站的缺点？</p><p>由于我认为，如果你热心于帮助用户，那么发布速度就非常重要。</p><p>在行动上显示偏见和坚持高标准并非相互排斥的概念。你应该对网站有一个设想，在它还未完成时就开始，知道未来的改进将产生更好的结果。</p><p>自 2020 年 3 月网站启动至 2020 年 8 月，我进行了约 1000 次编辑、改进和修复。假如我</p><p>等了五个月才把所有事情做对的话，数以千计的人将无法回答他们的问题，也不会知道如何在家工作。</p><p>飞轮需要一个初始动量来移动。</p><h2 id="-3-">收获 3：赢得用户信任</h2><p><br>最重要的一点是，用户需要信任一个网站(以及该网站的作者)，这样他们才有时间浏览网页，吸收网站的内容。</p><p>当用户第一次访问我的网站时，我发现有很多人跳转。考虑到网站的空位，这并不奇怪。</p><p>但通过大量的工作和网站的改进，人们实际上花了更多的时间来阅读我写的指南和我培养的资源。当我的作品在Google上被索引时，我对细节的关注也增加了。</p><p>在获得用户信任方面，经验是非常重要的。每星期我会检查三个指标：每页所花的时间、网站的退出和跳出率。</p><p>当我改进了常规网站和特定网站时，这些运营指标也得到了改善。为了减少延迟和加载时间，我将较大的图像文件替换为较小的图像文件。对网站速度进行优化。</p><p>对网站感兴趣的人并不多，但对它感兴趣的人却很多。为了对内容有用和有用，我在网站上花了一些时间。随着来访者告诉我他们的经历变得越来越好，我知道自己在朝着正确的方向前进。</p><p>在旋转时飞轮需要信任。</p><h2 id="--1">结论<br></h2><p>在隔离中花费大量的时间让我有时间发展新的技能，即网站开发。这种技能在新兴的垂直行业（远程工作）（帮助人们在家里工作）中释放出新的热情。</p><p>人都想在家里学会如何成功地工作，这是我想要生活的世界，也是我不断创新的使命。</p><p>原文：<a href="https://www.freecodecamp.org/news/why-i-got-hooked-creating-a-website-in-a-new-market/">How I Learned Web Development During the COVID-19 Lockdown and Built a Website Thousands of People Are Using</a>，作者：Adam Naor</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
