<?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[ Miever - 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[ Miever - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Fri, 08 May 2026 07:55:10 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/author/miever/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 图文详解 CSS Position 属性 ]]>
                </title>
                <description>
                    <![CDATA[ 今天我们将学习所有你需要知道的关于 CSS position 属性的例子，让我们开始吧 🎖️ 目录  * 什么是 CSS position 属性  * CSS 中的静态定位是什么  * CSS 中的相对定位和绝对定位是什么  * CSS 中的固定定位是什么  * CSS 中的粘性定位是什么 你可以在 YouTube 上观看本教程 [https://www.youtube.com/watch?v=yFXEur3SCGI&feature=emb_logo]。 CSS 中的 position 属性 如果你想要制作一个独特、漂亮、有艺术风格的网页，那么你绝对应该学习如何使用 CSS 的 position 属性。让我们来看看它是如何工作的。 使用 Flexbox 或者 Grid，你可以制作一个对称的网站，像这样： 使用 Flexbox 制作的网站 通过 position ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/css-position-property-explained/</link>
                <guid isPermaLink="false">610a5842c8a51b065cd07538</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miever ]]>
                </dc:creator>
                <pubDate>Tue, 03 Aug 2021 09:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/08/FCC-Thumbnail--4-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>今天我们将学习所有你需要知道的关于 CSS position 属性的例子，让我们开始吧 🎖️</p>
<h1 id="">目录</h1>
<ul>
<li>什么是 CSS position 属性</li>
<li>CSS 中的静态定位是什么</li>
<li>CSS 中的相对定位和绝对定位是什么</li>
<li>CSS 中的固定定位是什么</li>
<li>CSS 中的粘性定位是什么</li>
</ul>
<h2 id="youtube"><strong>你可以<a href="https://www.youtube.com/watch?v=yFXEur3SCGI&amp;feature=emb_logo">在 YouTube 上观看本教程</a>。</strong></h2>
<h1 id="cssposition">CSS 中的 position 属性</h1>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-3--6-.png" alt="Frame-3--6-" width="600" height="400" loading="lazy"></p>
<p>如果你想要制作一个<strong>独特、漂亮、有艺术风格的网页</strong>，那么你绝对应该学习如何使用 CSS 的 position 属性。让我们来看看它是如何工作的。</p>
<p>使用 <strong>Flexbox 或者 Grid</strong>，你可以制作一个<strong>对称的网站</strong>，像这样：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-35--2-.png" alt="Frame-35--2-" width="600" height="400" loading="lazy"></p>
<p>使用 Flexbox 制作的网站</p>
<p>通过 <strong>position 属性</strong>，你可以制作一个<strong>非对称的网站</strong>，像这样：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/A-1-1--2-.png" alt="A-1-1--2-" width="600" height="400" loading="lazy"></p>
<p>使用 Grid 和 position 属性制作的网站</p>
<p>你不能使用 Flexbox 和 Grid 把你的内容放在所有你想要的地方。你会受限于 X 轴和 Y 轴。看看这幅图你就会明白我的意思了：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-1--6-.png" alt="Frame-1--6-" width="600" height="400" loading="lazy"></p>
<p>对称的内容布局显示元素分别放置在 x 轴和 y 轴</p>
<p>你的盒子会遵循这些衡量因素。</p>
<p>但是使用 <strong>position 属性</strong>时，你可以通过将元素与其他元素分离，来将内容放置到任何你想要的地方。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-2--4-.png" alt="Frame-2--4-" width="600" height="400" loading="lazy"></p>
<p>不对称的内容布局，不需要考虑 x 轴和 y 轴的位置</p>
<p>你可以用这种布局把你的盒子放在任何你想要的地方。换句话说，你可以在屏幕上将元素<strong>自由移动</strong>。</p>
<p>下面是另一个使用 position 属性的例子：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-3--8-.png" alt="Frame-3--8-" width="600" height="400" loading="lazy"></p>
<p><strong>一个非对称的网页</strong></p>
<p>你可以使用 position 属性在整个页面来放置或移动那些小点和波浪图案和甜甜圈图像至任何你想要的地方。</p>
<h1 id="">项目搭建</h1>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-4--7-.png" alt="Frame-4--7-" width="600" height="400" loading="lazy"></p>
<p>对于这个项目，你可以使用任何安装了 <strong>emmet 插件</strong>的代码编辑器。我将使用 <a href="https://codepen.io">CodePen.io</a>.</p>
<h3 id="html">HTML</h3>
<p>body 标签内部，写如下代码：</p>
<pre><code class="language-HTML">&lt;div class="box-1"&gt; &lt;/div&gt;
</code></pre>
<h3 id="css">CSS</h3>
<p>清除默认浏览器设置并添加如下 CSS：</p>
<pre><code class="language-CSS">*{
   margin: 0px;
   padding: 0px;
   box-sizing: border-box;
}
</code></pre>
<p>设置 box-1 类样式：</p>
<pre><code class="language-CSS">.box-1{
   width: 120px;
   height: 120px;
   background-color: skyblue;
   border: 2px solid black;
}
</code></pre>
<p>position 属性有 5 个值：</p>
<ul>
<li>relative</li>
<li>absolute</li>
<li>static</li>
<li>fixed</li>
<li>sticky</li>
</ul>
<p>为了移动我们的容器，我们使用以下四个属性：</p>
<ul>
<li><strong>Top, Bottom</strong></li>
<li><strong>Left, Right</strong></li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-12--1-.png" alt="Frame-12--1-" width="600" height="400" loading="lazy"></p>
<h1 id="css">CSS 中的静态定位</h1>
<p>这是每个元素定位的<strong>默认值</strong>。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-10--3-.png" alt="Frame-10--3-" width="600" height="400" loading="lazy"></p>
<p>每个元素的默认位置</p>
<h1 id="css">CSS 中的相对定位和绝对定位</h1>
<p><strong>relative 属性</strong>和 <strong>absolute 属性</strong>的工作原理是一样的，不同在于，我们使用 <code>relative</code> 来标识父类，使用 <code>absolute</code> 来标识子类。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-11--2-.png" alt="Frame-11--2-" width="600" height="400" loading="lazy"></p>
<p>相对定位和绝对定位</p>
<h3 id="2">看如下 2 个例子</h3>
<p>我们先尝试一下 <strong><code>relative</code></strong> 值，写如下代码：</p>
<pre><code class="language-CSS">.box-1{
/* 在此写其他代码*/

   position: relative;
   left: 100px;
}
</code></pre>
<p>得到的结果如下：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-13--1-.png" alt="Frame-13--1-" width="600" height="400" loading="lazy"></p>
<p>我们可以使用 <strong><code>absolute</code></strong> 值得到相同的结果，例如：</p>
<pre><code class="language-CSS">.box-1{
/* 在此写其他代码*/

   position: absolute;
   left: 100px;
}
</code></pre>
<p>让我们研究一下相对定位和绝对定位的主要区别。</p>
<h3 id="css">CSS 中的相对定位和绝对定位</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/BEM-1--1-.png" alt="BEM-1--1-" width="600" height="400" loading="lazy"></p>
<h3 id="html">HTML</h3>
<p>在 HTML 中编写如下代码：</p>
<pre><code class="language-HTML">&lt;body&gt;
   &lt;div class="box-1"&gt;
    
       &lt;div class="box-2"&gt; &lt;/div&gt;	
        
   &lt;/div&gt;
&lt;/body&gt;
</code></pre>
<h3 id="css">CSS</h3>
<p>设置如下 CSS 样式：</p>
<pre><code class="language-CSS">.box-1{
	width: 300px;
	height: 300px;
	background-color: skyblue;
	border: 2px solid black;
    margin: auto;
}

.box-2{
	width: 100px;
	height:100px;
	background-color: pink;
	border: 2px solid black;
}
</code></pre>
<p>应该会是这样：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/dd-2.png" alt="dd-2" width="600" height="400" loading="lazy"></p>
<p>结果是左上方有一个蓝色盒子和一个较小的粉色盒子</p>
<p>现在，我们设置一下类样式：</p>
<pre><code class="language-CSS">body{ }

.box-1{ }

.box-2{ }
</code></pre>
<p>现在，在 CSS 中写如下类样式：</p>
<pre><code class="language-CSS">body{
	
}

.box-1{
/* 这是父元素  👇 */
	position: relative;
}
.box-2{
/* 这是子元素  👇 */
	position: absolute;
	left: 100px;
}
</code></pre>
<p>结果如下：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-14.png" alt="Frame-14" width="600" height="400" loading="lazy"></p>
<p>结果是粉色盒子右移了 100px</p>
<p>注意 .box-2 相对于 .box-1 移动了 100px。</p>
<p>这是因为 .box-1 是<strong>父元素</strong>，.box-2 是<strong>子元素</strong>。</p>
<p>再做一些改变，在 CSS 中写如下代码：</p>
<pre><code class="language-CSS">body{
/* 这是  👇 父元素 */
   position: relative;	
}

.box-1{

}
.box-2{
/* 这是  👇 子元素 */
   position: absolute;
    left: 100px;
}
</code></pre>
<p>结果是这样的：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-15.png" alt="Frame-15" width="600" height="400" loading="lazy"></p>
<p>结果是粉色盒子相对于 body 移动了100px。</p>
<p>注意是 .box-2 相对于 <strong>body</strong> 标签移动了 <strong>100px</strong> 。</p>
<p>这是因为 <strong>body</strong> 是 <strong>父元素</strong>，.box-2 是 <strong>子元素</strong>。</p>
<h1 id="fixed">固定定位（Fixed）</h1>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-16--1-.png" alt="Frame-16--1-" width="600" height="400" loading="lazy"></p>
<p>这个值会将元素固定在屏幕上的某一位置，即使浏览器发生滚动。让我们看几个例子，看看它是如何工作的。</p>
<h3 id="">固定定位的例子</h3>
<p>在 HTML 中写如下代码：</p>
<pre><code class="language-HTML">&lt;div class="container"&gt;
	
	&lt;p&gt;lorem200&lt;/p&gt;
    
	&lt;div class="box-1"&gt; fixed &lt;/div&gt;
    
	&lt;p&gt;lorem200&lt;/p&gt;		

&lt;/div&gt;
</code></pre>
<p>CSS 如下：</p>
<pre><code class="language-CSS">.container{
	height: 3000px;
}

.box-1{
	height: 120px;
	width: 120px;
	background-color: skyblue;
	border: 2px solid black;
	
	display: grid;
	place-content: center;
}
</code></pre>
<p>在底部添加如下 CSS：</p>
<pre><code class="language-CSS">.box-1{

	position: fixed;
	top: 100px;
	left: 200px;
}
</code></pre>
<p>结果如下：</p>
<p><img src="https://media.giphy.com/media/J6hbBulobEQz6HftRv/giphy.gif" alt="giphy" width="600" height="400" loading="lazy"></p>
<p>可以看到，即使在滚动浏览器时，该元素仍然是固定的。</p>
<h1 id="sticky">粘性定位（Sticky）</h1>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/06/Frame-17.png" alt="Frame-17" width="600" height="400" loading="lazy"></p>
<p>当滚动到屏幕某个点后，这个值会将元素<strong>固定在</strong>屏幕上，不再移动。</p>
<h3 id="">粘性定位示例</h3>
<p>无需改变你当前的 HTML 和 CSS 中的任何东西，只需改变这个值：</p>
<pre><code class="language-CSS">.box-1{
/*  使用这个值  👇 */
   position: sticky;
   top: 30px;
   left: 200px;
}
</code></pre>
<p>结果如下：</p>
<p><img src="https://media.giphy.com/media/175hkevbKC3yUfiLQc/giphy.gif" alt="giphy" width="600" height="400" loading="lazy"></p>
<p>你会发现，当滚动到屏幕某一<strong>特定点</strong>后，该元素会仍然固定在浏览器屏幕的顶端。</p>
<p>你可以查看这些网站，看看粘性定位在实际网站上是如何工作的。</p>
<ul>
<li><a href="https://awakeboards.com/">AwakeBoards</a></li>
<li><a href="https://ferme.shop/">Ferme</a></li>
<li><a href="https://www.ascensionlatorre.com/">LATORRE</a></li>
</ul>
<h1 id="">总结</h1>
<p>现在，你可以自信地制作漂亮的网站，并使用 position 属性解决简单的布局问题。</p>
<p>这是你读到最后的奖章。❤️</p>
<h3 id="">欢迎提出建议和批评 ❤️</h3>
<p><img src="https://chinese.freecodecamp.org/news/content/images/2021/09/usxsz1lstuwry3jlly4d.png" alt="usxsz1lstuwry3jlly4d" width="600" height="400" loading="lazy"></p>
<p><strong>YouTube <a href="https://youtube.com/c/joyshaheb">/ Joy Shaheb</a></strong></p>
<p><strong>LinkedIn <a href="https://www.linkedin.com/in/joyshaheb/">/ JoyShaheb</a></strong></p>
<p><strong>Twitter <a href="https://twitter.com/JoyShaheb">/ JoyShaheb</a></strong></p>
<p><strong>Instagram <a href="https://www.instagram.com/joyshaheb/">/ JoyShaheb</a></strong></p>
<h2 id="">感谢</h2>
<ul>
<li><a href="https://www.freepik.com/free-vector/young-girl-holding-pile-papers-cartoon-illustration_12566300.htm">Cute Girl Illustration</a></li>
<li><a href="https://www.flaticon.com/packs/kitty-avatars-3">Kitty Avatar</a></li>
</ul>
<!--kg-card-end: markdown--><p>原文：<a href="https://www.freecodecamp.org/news/css-position-property-explained/">How the CSS Position Property Works – Explained with Code Examples</a>，作者：<a href="https://www.freecodecamp.org/news/author/joy/">Joy Shaheb</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ CSS Background 属性完全指南 ]]>
                </title>
                <description>
                    <![CDATA[ 今天我们将学习 CSS 中 background 的各个属性及其对应的值。我们也会学习一些简写方法。让我们开始吧！🏅 目录  * 所有属性  * background-image  * background-size  * background-repeat  * background-position  * background-origin  * background-clip  * background-attachment  * background-color  * 简写  * 总结 如果你喜欢这篇文章，也可以在 YouTube 上观看本教程： 所有属性 这是我们今天要讨论的所有属性的列表。末尾的红色文本是简写。 什么是 CSS 背景（background）属性? CSS 背景（background）属性让我们可以控制图像的大小和属性，这样我们就可以为不同大小的屏幕制作响应性强的图像。它能帮助我们创建响应式网页。 例如， ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/learn-css-background-properties/</link>
                <guid isPermaLink="false">60e30f4c0f76ab0660b14081</guid>
                
                    <category>
                        <![CDATA[ CSS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miever ]]>
                </dc:creator>
                <pubDate>Mon, 05 Jul 2021 12:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/07/FreeCodeCamp--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>今天我们将学习 CSS 中 <strong>background</strong> 的各个属性及其对应的<strong>值</strong>。我们也会学习一些<strong>简写</strong>方法。让我们开始吧！🏅</p>
<h1 id="">目录</h1>
<ul>
<li>所有属性</li>
<li>background-image</li>
<li>background-size</li>
<li>background-repeat</li>
<li>background-position</li>
<li>background-origin</li>
<li>background-clip</li>
<li>background-attachment</li>
<li>background-color</li>
<li>简写</li>
<li>总结</li>
</ul>
<p>如果你喜欢这篇文章，也可以在 YouTube 上观看本教程：</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/hwJKjsZUPjY?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><!--kg-card-begin: markdown--><h1 id="">所有属性</h1>
<p>这是我们今天要讨论的<strong>所有属性</strong>的列表。末尾的红色文本是<strong>简写</strong>。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l25y304vndphll4795hr.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h2 id="cssbackground">什么是 CSS 背景（background）属性?</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iic3rs5ewx8c9xp6vryq.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>CSS 背景（background）属性让我们可以控制图像的大小和属性，这样我们就可以为不同大小的屏幕制作<strong>响应性强的</strong>图像。它能帮助我们创建响应式网页。</p>
<p>例如，</p>
<ul>
<li><strong>background-size</strong> 属性允许我们根据屏幕大小重置图像的宽度和高度。</li>
<li><strong>background-position</strong> 属性允许我们告诉浏览器将图像放在屏幕上的何处。</li>
</ul>
<p>以及其他的一些功能！</p>
<h2 id="">如何设置项目</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u72rvfe5181640ikqa32.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>在编码之前，你需要知道一点 HTML、CSS的相关知识，以及如何使用 VS Code。</p>
<p>要测试属性及其值，请遵循以下步骤：</p>
<ol>
<li>创建一个名为 'BACKGROUND-PROJECT' 的文件夹并在 VS Code 中打开</li>
<li>创建 <code>index.html</code> 和 <code>style.css</code> 文件</li>
<li>在 VS Code 中安装 'live server'</li>
<li>开启 live server</li>
</ol>
<h2 id="html">HTML</h2>
<p>在 HTML文件的 <strong>body标签</strong>中创建一个类名为 'container' 的 div。</p>
<pre><code class="language-html">   &lt;div class="container"&gt;&lt;/div&gt;
</code></pre>
<h2 id="css">CSS</h2>
<p>在 CSS 中，你<strong>必须</strong>为容器设置一个高度，否则将不会看到图像。在我们的例子中，我们将它设置为 100vh，像这样：</p>
<pre><code class="language-css">.container{
  height : 100vh;
}
</code></pre>
<h2 id="">下载项目的图像</h2>
<p>图像在我的 <strong><a href="https://github.com/JoyShaheb/Project-image-repo/tree/main/Background-property-images">GitHub repository</a></strong> 中。以下是获得它们的方法：</p>
<ol>
<li>请复制并访问以上链接</li>
<li>点击 <a href="https://minhaskamal.github.io/DownGit/#/home">downgit</a>，然后粘贴你复制的链接</li>
<li>按照视频中的步骤</li>
</ol>
<p><img src="https://cloud.githubusercontent.com/assets/5456665/17822364/940bded8-6678-11e6-9603-b84d75bccec1.gif" alt="Down Git Video" width="600" height="400" loading="lazy"></p>
<p>然后我们就准备好了！</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nmf39ig7wzdiunfje9lr.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>让我们开始编程吧😊</p>
<h1 id="cssbackgroundimage">CSS 中的 background-image 属性</h1>
<p>使用这个属性，我们可以为元素添加背景图像。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rhoch2auowlf2xdf4h8f.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>在写完类名之后写如下语法：</p>
<pre><code class="language-CSS">.container{
// 将图像 路径/URL 写到如下引号内
   background-image  :  url(' ');
}
</code></pre>
<p>我们可以通过<strong>两种方式</strong>使用 background-image 属性：</p>
<ul>
<li>通过图像的路径</li>
<li>通过具体的<strong>图像URL</strong></li>
</ul>
<h3 id="backgroundimage">如何通过图像路径使用 <code>background-image</code> 属性</h3>
<p>下面是使用图像路径时的 background-image 语法：</p>
<pre><code class="language-CSS">.container{
// 引号中填入的相对路径 👇
  background-image: url(' ');
}
</code></pre>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1jfuda4p0ki1hish775o.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>当你想在 CSS 中指定一个图像路径时，有三种情况：</p>
<ol>
<li>当 <code>image</code> 和 <code>style.css</code> 在同一文件夹下</li>
<li>当 <code>image</code> 在下一级文件夹中</li>
<li>当 <code>image</code> 在上一级文件夹中</li>
</ol>
<p>当 <code>image</code> 和 <code>style.css</code> 在<strong>同一文件夹</strong>时, 它看起来像下面这样。</p>
<p>注意 <strong><code>kitty.png</code></strong> 和 <strong><code>style.css</code></strong> 在同一父级文件夹 <strong>Background-project</strong> 中：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/Frame-25--1--1.png" alt="Frame-25--1--1" width="600" height="400" loading="lazy"></p>
<p>要设置 <code>kitty.png</code> 的文件路径，在 <code>style.css</code> 中要编写以下代码：</p>
<pre><code class="language-css"> .container{
   background-image : url("kitty.png");
   
   height: 100vh;
// 设置大小和停止图像拉伸
   background-repeat : no-repeat;
   background-size : contain;
 }
</code></pre>
<p>当图像在<strong>下一级文件夹</strong>，<code>style.css</code> 在上一级文件夹时，注意，下图中的<code>kitty.png</code> 在 Assets 文件夹中，而 <code>style.css</code> 在上一级文件夹中。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/Frame-26.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>要设置 <code>kitty.png</code> 的文件路径，我们需要在 <code>style.css</code> 中的引号后面写一个点和斜杠，就像这样（./）。然后我们写入文件夹的名称，然后斜杠（/），最后我们写入 image 的名称，像这样：</p>
<pre><code class="language-css"> .container{
   background-image : url("./Assets/kitty.png");

   height: 100vh;
// 设置大小和停止图像拉伸
   background-repeat : no-repeat;
   background-size : contain;
 }
</code></pre>
<p>如果图像是在<strong>上一级文件夹</strong>中，我们需要返回。注意，在下图中，<code>style.css</code> 在 src 文件夹中，<code>kitty.png</code> 在 src 文件夹外。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/Frame-27.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>要设置 <code>kitty.png</code> 的文件路径，我们要在 <code>style.css</code> 中的引号后面写两个点和一个斜杠（../）。然后我们写下图像的名称，像这样：</p>
<pre><code class="language-css"> .container{
   background-image : url("../kitty.png");

   height: 100vh;
// 设置大小和停止图像拉伸
   background-repeat : no-repeat;
   background-size : contain;
 }
</code></pre>
<h3 id="backgroundimage">如何通过链接使用 <code>background-image</code> 属性</h3>
<p>这个非常简单，将正确的链接插入到 <code>url()</code> 中即可。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/szxp3jqyjyksrep1ep82.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>要使用一个是<strong>链接</strong>的图像，我们需要写以下代码：</p>
<pre><code class="language-css">//example -&gt;
 .container{
    background-image : url("https://dev-to-uploads.s3.amazonaws.com/uploads/articles/szxp3jqyjyksrep1ep82.png");

  height: 100vh;
// 设置大小和停止图像拉伸
   background-repeat : no-repeat;
   background-size : contain;
 }
</code></pre>
<h3 id="">休息一下</h3>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4diremjrrbvcm2o4l77m.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h1 id="cssbackgroundsize">CSS 中的 background-size 属性</h1>
<p>我们可以通过调整图像的 <code>background-size</code> 来调整图像大小。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xxbrgckb20fy8tmrg9ik.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>在写完类名之后写如下语法：</p>
<pre><code class="language-CSS">.container{
// 我们将在这里写下值 👇
  background-size  : cover;
}
</code></pre>
<p>你可以通过 <strong>3 种方式</strong>使用 background-size 属性：</p>
<ul>
<li>使用 Cover/Contain 值</li>
<li>设置图像宽度和高度</li>
<li>使用 auto</li>
</ul>
<p>让我们从讨论 <strong>cover 和 contain 值</strong>开始</p>
<p>Bear 大小 : [718px X 614px]</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uixn5c8mrafpmlhth9iy.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h3 id="cover">Cover 值</h3>
<p>为此，我们必须包含一个图像，为其设置高度，并禁止图像重复。我们在 CSS 中这样做：</p>
<pre><code class="language-css">.container{
  background-image : url('cute-bear.png');
  background-repeat: no-repeat;
  background-size : cover;

// 我们必须包含一个图像，设置它的高度，并像这样停止图像重复：👇
  height : 100vh;
}
</code></pre>
<p>当我们使用这个属性时，当我们调整窗口大小的时候，它也会将图像拉伸到整个屏幕。请看下面的视频: 👇</p>
<p><img src="https://media.giphy.com/media/9OdZ0B1wjO1kdofBBu/giphy.gif" alt="Cover" width="600" height="400" loading="lazy"></p>
<h3 id="contain">contain 值</h3>
<p>步骤相同 - 我们必须包含一个图像，设置它的高度，并禁止图像重复，如下：</p>
<pre><code class="language-css">.container{
  background-image : url('cute-bear.png');
  background-repeat: no-repeat;
  background-size : contain;

// 在此必须设置高度
  height : 100vh;
}
</code></pre>
<p>即使我们调整窗口的大小，它的值也不会发生改变。请看下面的视频：</p>
<p><img src="https://media.giphy.com/media/VaqDcSh38DTz7YbV6p/giphy.gif" alt="Contain" width="600" height="400" loading="lazy"></p>
<h3 id="">图像宽度和高度</h3>
<p>通过 background-size 属性我们可以调整图像的宽度和高度。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/36p9azoztkvawbvy6244.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>以下是 CSS 中的语法：</p>
<pre><code class="language-css">.container{
// 这我们可以看到宽度 👇  和  👇 高度
  background-size : 200px   200px;
}
</code></pre>
<p>当然，不要忘记插入一张图像，设置其高度，禁止重复。代码如下：</p>
<pre><code class="language-css">.container{
  background-image : url('cute-bear.png');
  background-repeat: no-repeat;

// 这我们可以看到宽度 👇  和  👇 高度
  background-size : 200px  200px;

// 必须包含高度
  height : 100vh;
}
</code></pre>
<h3 id="autosizing">Auto sizing</h3>
<p>当我们使用这个值的时候，图像会保持其原来的大小，不会随着我们调整窗口大小而改变。如下：</p>
<p><img src="https://media.giphy.com/media/hHc7ZhU7BB4NX8gLRR/giphy.gif" alt="giphy" width="600" height="400" loading="lazy"></p>
<h1 id="cssbackgroundrepeat">CSS 中的 background-repeat 属性</h1>
<p>这个属性会使对应图像重复多次。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/629rnxirqrdr8p5fapcd.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>我们在写完类名之后编写如下 CSS 语法：</p>
<pre><code class="language-CSS">.container{
// 在这里改变值 👇
  background-repeat : repeat;
}
</code></pre>
<p>这个属性有 6 个值：</p>
<ul>
<li>repeat</li>
<li>repeat-x</li>
<li>repeat-y</li>
<li>no-repeat</li>
<li>space</li>
<li>round</li>
</ul>
<p>下面是这 6 个值中每个值的结果。注意在这个例子中 kitty 的大小是 [200px X 200px]。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jj2jwfwh0pboqpylkeq0.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><img src="https://media.giphy.com/media/3BUBxpCxmcDrBN4aZF/giphy.gif" alt="Round" width="600" height="400" loading="lazy"></p>
<p><img src="https://media.giphy.com/media/cO0jNSpVi0I3FWD62G/giphy.gif" alt="Space" width="600" height="400" loading="lazy"></p>
<p>现在，我们来研究一下每个值会发生什么。但在此之前，我们需要插入一张图像并使用 <code>background-image</code> 属性，像这样：</p>
<pre><code class="language-css">.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat :  ; // 我们在这里写对应属性值

   height : 100vh;
}
</code></pre>
<h3 id="repeat">repeat 值</h3>
<p>通过使用这个值，我们可以沿着 <strong>X 轴和 Y 轴</strong> 重复对应图像多次，直到容器被填充满。在这，kitty 的大小是 200px x 200px。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/26zsa1dn161pawjqxuqp.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>为此，我们可以这么写：</p>
<pre><code class="language-CSS">.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : repeat;

   height : 100vh;
}
</code></pre>
<h3 id="repeatx">repeat-x 值</h3>
<p>顾名思义，我们可以使用这个值在容器 X 轴上重复对应图像，直到容器 X 轴被填充满。Kitty 的大小：200px X 200px。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pl4znzrwcevpr5w1a4i5.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>为了实现这一点，我们这么写：</p>
<pre><code class="language-CSS">.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : repeat-x;

   height : 100vh;
}
</code></pre>
<h3 id="repeaty">repeat-y 值</h3>
<p>与 “repeat-x” 同理，但是是作用在 <strong>Y 轴上</strong> 的。Kitty 的大小：200px X 200px。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7yo3i3bp8cw2r6zqhtvm.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>为了实现这一点，我们可以这么写：</p>
<pre><code class="language-CSS">.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : repeat-y ;

   height : 100vh;
}
</code></pre>
<h3 id="norepeat">no-repeat 值</h3>
<p>我们使用这个值可以禁止图像重复，Kitty 大小：200px X 200px。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p2okgurnuakrnqbyv6kr.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>为了实现这一点，我们可以这么写：</p>
<pre><code class="language-CSS">.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : no-repeat ; 

   height : 100vh;
}
</code></pre>
<h3 id="space">space 值</h3>
<p>这个值在 X 轴和 Y 轴都会起作用。当我们调整窗口大小时，我们可以看到值 <strong>space 和 round</strong> 之间的主要区别。注意，当我们调整窗口大小时，我们有 <strong>空的空间</strong>：</p>
<p><img src="https://media.giphy.com/media/cO0jNSpVi0I3FWD62G/giphy.gif" alt="Space" width="600" height="400" loading="lazy"></p>
<p>为了测试这个值，我们可以这么写：</p>
<pre><code class="language-CSS">.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : space ;

   height : 100vh;
}
</code></pre>
<h3 id="round">round 值</h3>
<p>这个值在 X 轴和 Y 轴都起作用。在调整窗口大小时注意图像<strong>拉伸</strong>。</p>
<p><img src="https://media.giphy.com/media/3BUBxpCxmcDrBN4aZF/giphy.gif" alt="Round" width="600" height="400" loading="lazy"></p>
<p>跟着写 -&gt;</p>
<pre><code class="language-CSS">.container{
   background-image : url('kitty.png');
   background-size : 200px 200px;
   background-repeat : round ; 

   height : 100vh;
}
</code></pre>
<h1 id="cssbackgroundposition">CSS 中的 background-position 属性</h1>
<p>此属性用于更改图像在屏幕上的位置。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j4ndvr71f0yl9c44kbc7.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>语法如下：</p>
<pre><code class="language-css">.container{
// 这是       X 轴👇  和  👇 Y 轴
background-position : 300px  200px;
}
</code></pre>
<p>当然不要忘记插入一张图像，设置高度，禁止图像重复。我们使用 <code>background-size</code> 属性设置 kitty 的大小到 200px X 200px：</p>
<pre><code class="language-css">.container{
  background-image: url("kitty-idea.png");
  background-size: 200px 200px;
  background-repeat: no-repeat;

// 这是       X 轴👇  和  👇 Y 轴
  background-position : 300px 200px;
  height: 100vh;
}
</code></pre>
<p>结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/65p2htkztmijbm1hxlug.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>你也可以使用这些值的组合：</p>
<ul>
<li>top</li>
<li>left</li>
<li>right</li>
<li>bottom</li>
<li>percentage values</li>
</ul>
<p>例如，让我们将 kitty 设置到屏幕右下侧。代码如下：</p>
<pre><code class="language-css">.container{
  background-image: url("kitty-idea.png");
  background-size: 200px 200px;
  background-repeat: no-repeat;

// 这是       X 轴👇  和  👇 Y 轴
  background-position : bottom right;
  height: 100vh;
}
</code></pre>
<p>结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ga6veuh8ea3yzq7nend2.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>计算屏幕的可用空间，% 值决定了图像的位置。代码如下：</p>
<pre><code class="language-css">.container{
  background-image: url("kitty-idea.png");
  background-size: 200px 200px;
  background-repeat: no-repeat;

// 这是       X 轴👇  和  👇 Y 轴
  background-position : 25% 15%;
  height: 100vh;
}
</code></pre>
<p>结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fazbxgdpkqeomum02qv7.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h1 id="cssbackgroundorigin">CSS 中的 background-origin 属性</h1>
<p>这个属性允许我们在 CSS 盒子模型中设置图像的原点。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wc2b6ypgcfdtol6am14g.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>我们在写完类名之后编写如下语法：</p>
<pre><code class="language-CSS">.container{
// We'll write values   👇 here
  background-origin: border-box;
}
</code></pre>
<p>它的四个值分别是：</p>
<ul>
<li>border-box</li>
<li>padding-box</li>
<li>content-box</li>
<li>inherit</li>
</ul>
<p>在标准 CSS 盒子模型中，最外侧是 border，然后是 padding，最后是在中间的内容（content）。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p3mdn6hpd1u892akrkj5.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>下面是每个属性的结果：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/27ptyulhvxqi4idrw68n.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>为了重现这些结果：</p>
<ul>
<li>首先我们需要一张图像，禁止重复，为<strong>容器及图像</strong>设置宽度和高度。</li>
<li>完成后，设置 40px 的 padding，否则我们无法看到 padding box 和 content box 的区别。</li>
<li>然后设置 25px 的红色边框，设置边框样式为虚线，这样我们就可以在屏幕中看到虚线边框。</li>
<li>设置 background-size 到 400px &amp; 400px</li>
</ul>
<p>代码像下面这样：</p>
<pre><code class="language-css">.container{
  background-image: url('cute-girl.png');
  background-repeat: no-repeat;
  background-size: 400px 400px;

// 在这里改变值来看有何不同 👇
  background-origin: border-box;
  padding: 40px;
  border: 25px solid red;
  border-style: dashed;

// 容器的宽度和高度 👇
  width : 400px;
  height : 400px;
}
</code></pre>
<h3 id="">休息一下</h3>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yahewko7hckdgp7p4xux.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h1 id="cssbackgroundclip">CSS 中的 background-clip 属性</h1>
<p>这个属性与 <code>background-origin</code> 属性类似，最主要的区别就是 <code>background-clip</code> 会将图像<strong>剪切</strong>，使其适应对应的 box，然而 <code>background-origin</code> 会将 content <strong>推到</strong> box 中。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r4ga97rke3kgppd7qlxn.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>我们在写完类名之后编写如下语法：</p>
<pre><code class="language-CSS">.container{
// We'll write values   👇 here
  background-clip  : border-box;
}
</code></pre>
<p>其四个值分别为：</p>
<ul>
<li>border-box</li>
<li>padding-box</li>
<li>content-box</li>
<li>inherit</li>
</ul>
<p>下面是每个值的结果:</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xgd6sh8237bmvpnujl8r.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>为了重现这些结果:</p>
<ul>
<li>首先我们需要一张图像，禁止重复，为<strong>容器及图像</strong>设置宽度和高度。</li>
<li>完成后，我们设置 40px 的 padding，否则我们无法看到 padding box 和 content box 的区别。</li>
<li>然后我们设置 25px 的红色边框，设置边框样式为虚线，这样我们就可以在屏幕中看到虚线边框。</li>
<li>设置 background-size 到 400px &amp; 400px</li>
</ul>
<p>代码像下面这样：</p>
<pre><code class="language-css">.container{
  background-image: url('cute-girl.png');
  background-repeat: no-repeat;
  background-size: 400px 400px;

// 改变这里的值来看其变化
  background-clip: border-box;
  padding: 40px;
  border: 25px solid red;
  border-style: dashed;

// 容器宽度和高度 👇
  width : 400px;
  height : 400px;
}
</code></pre>
<h1 id="cssbackgroundattachment">CSS 中的 background-attachment 属性</h1>
<p>这个属性允许我们在<strong>滚动时</strong>控制内容和图像的行为。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/n1xx67vtt5w3c861sskx.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>我们在写完类名之后编写如下语法：</p>
<pre><code class="language-CSS">.container{
// 我们在这里改变其值 👇
background-attachment: scroll;
}
</code></pre>
<p>其三个值如下：</p>
<ul>
<li>scroll</li>
<li>fixed</li>
<li>local</li>
</ul>
<p>当我们使用 <strong>scroll</strong> 时，图像会随着页面的滚动而滚动（这是默认的）。使用 <strong>fixed</strong> 时图像不会随着页面其余部分的滚动而移动，在屏幕中是固定的。而 <strong>local</strong> 会随着元素内容的滚动而滚动，直到滚动到内容结束。</p>
<p>你可以在<a href="https://codepen.io/ematte/pen/GRjJjro">这里</a>看到结果。</p>
<p><a href="https://dev.to/hadrysmateusz/learn-all-8-background-css-properties-in-5-minutes-2lk4">Here's where I got this pen</a>.</p>
<h1 id="cssbackgroundcolor">CSS 中的 background-color 属性</h1>
<p>你可以使用这个属性填充背景颜色。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mh7pe7phpj2vrvz304ma.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>我们在写完类名之后编写如下语法：</p>
<pre><code class="language-CSS">.container{
// we'll change values 👇  here
   background-color :  red;
}
</code></pre>
<p>在众多值中，最受欢迎的是：</p>
<ul>
<li>通过名称或者十六进制值对应的颜色</li>
<li>使用 <code>RGB()</code> 颜色函数</li>
<li>使用 <code>linear-gradient()</code> 函数</li>
</ul>
<p>如何通过名称或者十六进制获得一个纯的背景颜色？</p>
<p>你可以使用颜色的名称来设置背景颜色，像这样：</p>
<pre><code class="language-css">.container{
   background-color : red;

   height : 100vh;
}
</code></pre>
<p>或者，你也可以使用十六进制来设置颜色，像这样：</p>
<pre><code class="language-css">.container{
   background-color : #ff0000; //red color

   height : 100vh;
}
</code></pre>
<p>你可以查看这些链接来获得更多颜色：</p>
<ul>
<li><a href="https://coolors.co/">coolors.co</a></li>
<li><a href="https://flatuicolors.com/">flatuicolors.com</a></li>
</ul>
<h3 id="rbg">如何使用 RBG() 函数来设置背景颜色</h3>
<p>我们使用 <code>RGB()</code> 颜色函数来设置背景颜色，像这样：</p>
<pre><code class="language-css">.container{
// 颜色名称是 "American River"
   background-color : rgb(99, 110, 114);

   height : 100vh;
}
</code></pre>
<p>或者你也可以使用 <code>RGBA()</code> 来设置颜色和透明度，像这样：</p>
<pre><code class="language-css">.container{
// 0.5 代表50%的透明度 👇 
   background-color :  rgba(99, 110, 114, 0.5);

   height : 100vh;
}
</code></pre>
<p>这是一个用颜色命名为 'Eton blue' 的不同不透明度的测试：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yzc82sudq8es7ocok12g.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>如何通过 linear-gradient() 函数来设置背景颜色？</p>
<p>你可以使用此函数创建一个不少于一种颜色的渐变颜色。以下是一些渐变颜色的例子：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f0j3e3r6kobycowckdxg.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>你可以浏览 <a href="https://uigradients.com/#Summer">这个网站</a> 来获得更多颜色相关的 CSS 代码。</p>
<p>让我们重新创建这个背景色：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jkf21o97m7gqzpme810k.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>'#22c1c3' 表示左边的颜色，'#fdbb2d'表示右边的颜色。'90deg' 告诉我们如何通过这两种颜色的梯度创建一个渐变。</p>
<p>代码如下：</p>
<pre><code class="language-css">.container{
 
   background: linear-gradient(90deg, #22c1c3, #fdbb2d);  

   height : 100vh;
}
</code></pre>
<h1 id="css">CSS 属性的简写</h1>
<p>下面是 background 属性的简写顺序：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/newvcc4rvegnbkblwzyb.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>对于这个案例，我们将图像 <code>kitty.png</code> 放在长和宽都为 200px，蓝色背景的容器中。代码如下所示：</p>
<pre><code class="language-css">.container{
 
   background-color : skyblue;
   background-image : url('kitty.png);
   background-repeat: no-repeat;
   background-attachment: fixed;
   background-position: 200px 200px;

   height : 100vh;
}
</code></pre>
<p>下面是使用简写的代码：</p>
<pre><code class="language-css">.container{
 
   background: skyblue url('kitty.png) no-repeat fixed 200px 200px;

   height : 100vh;
}
</code></pre>
<p>这个简写确实节省了我们的时间。如果你想要跳过某个属性，你只需要保证其余属性的顺序即可。</p>
<h1 id="">总结</h1>
<p>这是你读到最后的奖励 ❤️</p>
<p>欢迎提出建议和批评 ❤️</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/i/usxsz1lstuwry3jlly4d.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h3 id="credits">Credits</h3>
<ul>
<li><a href="https://www.pexels.com/photo/woman-lying-on-plants-2125610/">Cute Girl I have a crush on 🥰</a></li>
<li><a href="https://www.flaticon.com/packs/kitty-avatars-3">kitty Avatar</a></li>
<li><a href="https://www.freepik.com/free-vector/cute-bear-is-happy-cartoon-illustration_12341167.htm#position=4">Cute panda</a></li>
<li><a href="https://www.freepik.com/free-vector/set-happy-cute-cats-cartoon-illustration_12566295.htm#position=11">cute cat with duck</a></li>
<li><a href="https://www.freepik.com/free-vector/young-girl-different-gestures-cartoon-illustration_12566309.htm#page=1&amp;position=22">cute girl illustration</a></li>
<li><a href="https://www.freepik.com/free-vector/set-cute-rabbit-with-duck-feel-happy-sad-cartoon-illustration_12573654.htm#position=7">Rabbit with duck</a></li>
<li><a href="https://css-tricks.com/almanac/properties/b/background/">CSS-Tricks</a></li>
</ul>
<p><strong>YouTube <a href="https://youtube.com/c/joyshaheb">/ Joy Shaheb</a></strong></p>
<p><strong>Twitter <a href="https://twitter.com/JoyShaheb">/ JoyShaheb</a></strong></p>
<p><strong>Instagram <a href="https://www.instagram.com/joyshaheb/">/ JoyShaheb</a></strong></p>
<!--kg-card-end: markdown--><p>原文：<a href="https://www.freecodecamp.org/news/learn-css-background-properties/">Every CSS Background Property Illustrated and Explained with Code Examples 🎖️</a>，作者：<a href="https://www.freecodecamp.org/news/author/joy/">Joy Shaheb</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript Async/Await 教程——通过制作冰淇淋来学习 JavaScript 异步编程 ]]>
                </title>
                <description>
                    <![CDATA[ 今天我们将通过建立并运行一个冰淇淋店来学习异步 JavaScript。在此过程中，你将学习如何使用：  * Callbacks  * Promises  * Async / Await 我们将在本文中介绍以下内容：  * 什么是异步 JavaScript  * JavaScript 中的同步与异步  * Callbacks 如何在 JavaScript 中运行  * Promises 如何在 JavaScript 中运行  * Async/Await 如何在 JavaScript 中运行 让我们开始吧！ 如果你喜欢，也可以在 YouTube 上观看本教程 [https://www.youtube.com/watch?v=n5ZtTO1ArWg&feature=emb_imp_woyt]。 什么是异步 JavaScript？ 如果你想高效地构建项目，那么这个概念很适合你。 异步 JavaScript ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/javascript-async-await-tutorial-learn-callbacks-promises-async-await-by-making-icecream/</link>
                <guid isPermaLink="false">60cf36d01b6c2406049fda25</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miever ]]>
                </dc:creator>
                <pubDate>Sat, 19 Jun 2021 10:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/06/FCC-Thumbnail--3-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>今天我们将通过建立并运行一个<strong>冰淇淋店</strong>来学习<strong>异步 JavaScript</strong>。在此过程中，你将学习如何使用：</p>
<ul>
<li>Callbacks</li>
<li>Promises</li>
<li>Async / Await</li>
</ul>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b1j935dg72g9u8zvh2oi.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h1 id="">我们将在本文中介绍以下内容：</h1>
<ul>
<li>什么是异步 JavaScript</li>
<li>JavaScript 中的同步与异步</li>
<li>Callbacks 如何在 JavaScript 中运行</li>
<li>Promises 如何在 JavaScript 中运行</li>
<li>Async/Await 如何在 JavaScript 中运行</li>
</ul>
<p>让我们开始吧！</p>
<h3 id="youtube">如果你喜欢，也可以<a href="https://www.youtube.com/watch?v=n5ZtTO1ArWg&amp;feature=emb_imp_woyt">在 YouTube 上观看本教程</a>。</h3>
<h1 id="javascript">什么是异步 JavaScript？</h1>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7yd96tgxvuowqmfgcx6b.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>如果你想高效地构建项目，那么这个概念很适合你。</p>
<p>异步 JavaScript 理论可以帮助你将大型复杂的项目分解为较小的任务。</p>
<p>然后你可以使用 <strong>callbacks、promises 或 Async/await</strong> 中的任何一种来运行这些小任务，获得最好的结果。</p>
<p>让我们开始吧!🎖️</p>
<h1 id="javascript">JavaScript 中的同步和异步</h1>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/arzbf1rc3pi4yi6u8wup.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h2 id="">什么是同步系统？</h2>
<p>在同步系统中，任务一个接一个地完成。</p>
<p>想象一下，如果你只有一只手去完成十项任务，那么在同一个时间你只能做一个任务。</p>
<p>看看这个动图 – 这里会发生一件事：</p>
<p><img src="https://media.giphy.com/media/ICIS16DkE9qB9HVxtq/giphy.gif" alt="同步系统" width="600" height="400" loading="lazy"></p>
<p>你将看到，直到第一个图像完全加载，第二个图像才开始加载。</p>
<p>JavaScript 默认是同步的 <strong>[单线程]</strong>。你可以这样想 ——— 单线程意味着一次只能做一件事。</p>
<h2 id="">什么是异步系统?</h2>
<p>在这个系统中，任务是独立完成的。</p>
<p>假设你有十个任务以及十只手，那么在同一时间，每只手都可以同时独立完成每一项任务。</p>
<p>看看这张动图 - 你可以看到每个图像都是同时加载的。</p>
<p><img src="https://media.giphy.com/media/MMDnmJnE7uhX6KtcKc/giphy.gif" alt="异步系统" width="600" height="400" loading="lazy"></p>
<p>同样，所有的图像都以自己的速度加载，它们都不会等待其他任务先完成。</p>
<h2 id="jsjs">总结一下同步 JS 和异步 JS</h2>
<p>想象三张图片在跑马拉松，在一个：</p>
<ul>
<li><strong>同步</strong>系统，三张图片在同一条跑道上，一个不能超过另外一个，比赛得一个接一个地完成，如果 2 号图像停止，后续的图片也会停止。</li>
</ul>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w1r9y4ghhq0t8wjb1u9h.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<ul>
<li><strong>异步</strong>系统，这三张图片在不同的跑道上，它们会在自己的跑道上完成比赛，不会受其他图片的影响：<br>
<img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ehknx5shc4orh32s0ktk.png" alt="Alt Text" width="600" height="400" loading="lazy"></li>
</ul>
<h2 id="">同步和异步代码示例</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzbnpcza9rbj8xgiby95.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>在开始我们的项目之前，让我们看一些例子来消除一些疑问。</p>
<h3 id="">同步的代码示例</h3>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5m6p1qy522lj3auvl5ty.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>为了测试同步系统，用 JavaScript 写以下代码：</p>
<pre><code class="language-javascript">console.log(" I ");

console.log(" eat ");

console.log(" Ice Cream ");
</code></pre>
<p>控制台的结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/54izy7zyo52j2z6netls.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h3 id="">异步代码示例</h3>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y5d0o8unbe8c67qeqz0w.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>我们假设吃冰淇淋需要两秒钟。现在，让我们测试一个异步系统。用 JavaScript 编写下面的代码。</p>
<p><strong>注意：</strong> 不用担心，我们将在本文后面讨论 <code>setTimeout()</code> 函数。</p>
<pre><code class="language-javascript">console.log("I");

// 这将会在 2 秒钟之后显示

setTimeout(()=&gt;{
  console.log("eat");
},2000)

console.log("Ice Cream")
</code></pre>
<p>控制台的结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o44c2t0r7bknkadoumgx.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>既然我们已经了解了同步操作和异步操作之间的区别，那么让我们来创建一个冰淇淋商店。</p>
<h2 id="">如何设置我们的项目</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2mzbtcnm67v2iys7cix7.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>对于这个项目，你只需要打开 <a href="https://codepen.io/">Codepen.io</a> 直接开始编码。或者，你可以用 VS Code 编辑器来做。</p>
<p>打开 JavaScript 部分，然后打开开发人员控制台，我们将编写代码并在控制台中查看结果。</p>
<h1 id="javascript">JavaScript 中的回调函数是什么？</h1>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s5iloofqsv3lcdl4flsi.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>当你将一个函数作为参数嵌套到另一个函数中时，这叫作回调。</p>
<p>下面是一个回调的说明:</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uz3pl56lmoc2pq7wzi2s.png" alt="uz3pl56lmoc2pq7wzi2s" width="600" height="400" loading="lazy"></p>
<p><strong>一个回调的例子</strong></p>
<p>别担心，我们马上就会看到一些回调的例子。</p>
<h3 id="">为什么要使用回调?</h3>
<p>在做一个复杂的任务时，我们把它分解成更小的步骤。为了根据时间（可选）和顺序在这些步骤之间建立关系，我们会使用回调。</p>
<p>看看这个例子：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o05q7ortgctx2oeyntfn.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>图表包含制作冰淇淋的步骤</strong></p>
<p>这些是制作冰淇淋需要的小步骤。还要注意，在本例中，步骤的顺序和计时是至关重要的，你不能只把水果切了就端上冰淇淋。</p>
<p>同时，如果前一个步骤没有完成，我们就不能进入下一个步骤。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2v1rn50smjul9arkneza.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>为了更详细地解释这一点，让我们开始做冰淇淋店的生意。</p>
<h2 id="">等等......</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cq8exwor5aiciu2j6jwu.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>该店将分为两部分：</p>
<ul>
<li>储藏室里有所有的配料 - 后台</li>
<li>我们将在厨房里制作冰淇淋 - 前端</li>
</ul>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i69bws707m5rvsj34i9o.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h2 id="">让我们存储数据</h2>
<p>现在，我们要把配料存储在一个对象中。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ihezrht8dgg9xn8lm2k9.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>你可以像这样在对象中存储成分：</p>
<pre><code class="language-javascript">let stocks = {
    Fruits : ["strawberry", "grapes", "banana", "apple"]
 }
</code></pre>
<p>我们的其他食材在这里：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6dcwr770l0ubupv0r2gj.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>你可以像这样将这些其他成分存储在 JavaScript 对象中：</p>
<pre><code class="language-javascript">let stocks = {
    Fruits : ["strawberry", "grapes", "banana", "apple"],
    liquid : ["water", "ice"],
    holder : ["cone", "cup", "stick"],
    toppings : ["chocolate", "peanuts"],
 };
</code></pre>
<p>整个业务取决于客户的 <strong>订单</strong>。一接到订单，我们就开始生产，然后供应冰淇淋。因此我们将创建两个函数 -&gt;</p>
<ul>
<li><code>order</code></li>
<li><code>production</code></li>
</ul>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3bnzniiyamo0b9l7e806.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>这就是它的工作原理：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r8h8ra9wor8cs3dgddpb.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>从客户那里获取订单，取得食材，开始生产，然后上桌。</p>
<p>我们来写一下函数。在这里我们使用箭头函数:</p>
<pre><code class="language-javascript">let order = () =&gt;{};

let production = () =&gt;{};
</code></pre>
<p>现在，让我们使用回调建立这两个函数之间的关系，如下所示：</p>
<pre><code class="language-javascript">let order = (call_production) =&gt;{

  call_production();
};

let production = () =&gt;{};
</code></pre>
<h3 id="">让我们做个小测试</h3>
<p>我们将使用  <code>console.log()</code> 函数进行测试，以消除关于如何建立这两个函数之间的关系的疑问。</p>
<pre><code class="language-javascript">let order = (call_production) =&gt;{

console.log("Order placed. Please call production")

// function 👇 is being called 
  call_production();
};

let production = () =&gt;{

console.log("Production has started")

};
</code></pre>
<p>为了运行测试，我们将调用 <strong><code>order</code></strong> 函数。我们将添加第二个函数名为 <code>production</code> 作为它的参数。</p>
<pre><code class="language-javascript">// name 👇 of our second function
// 将第二个函数命名为 👇
order(production);
</code></pre>
<p>下面是控制台中的结果：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u41ugdxxed1q8coz5hol.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h2 id="">休息一下</h2>
<p>到目前为止一切都很好，休息一下吧!</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tnr74waq6noc0djln3qx.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h2 id="consolelog">清除 console.log 日志</h2>
<p>保留这段代码并删除所有的东西，不要删除我们的 stocks 变量。在我们的第一个函数中，传递另一个参数，以便我们可以接收订单，即水果名：</p>
<pre><code class="language-javascript">// 函数 1

let order = (fruit_name, call_production) =&gt;{

  call_production();
};

// 函数 2

let production = () =&gt;{};


// 触发 👇

order("", production);
</code></pre>
<p>下面是我们的步骤，以及执行每个步骤所需的时间。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rphpp2lqjnk7f0tv5g3d.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>图表包含制作冰淇淋的步骤</strong></p>
<p>在这个图表中，你可以看到第一步是下订单，这需要 2 秒。第二步是切水果（2秒），第三步是加水和冰（1秒），第四步启动机器（1秒），第五步是选择容器（2秒），第六步是选择配料（3秒），以及第七步，也就是最后一步，端上冰淇淋，这需要 2 秒。</p>
<p>要建立计时，函数 <code>setTimeout()</code> 非常好，因为它也使用一个回调函数作为参数。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qwrg1taugyhvjnkx8xpp.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>setTimeout() 函数的语法</strong></p>
<p>现在，让我们使用这个函数来选择水果：</p>
<pre><code class="language-javascript">// 函数 1

let order = (fruit_name, call_production) =&gt;{

  setTimeout(function(){

    console.log(`${stocks.Fruits[fruit_name]} was selected`)

// Order placed. Call production to start
   call_production();
  },2000)
};

// 函数 2

let production = () =&gt;{
  // blank for now
};

// 触发 👇
order(0, production);
</code></pre>
<p>下面是控制台中的结果：</p>
<p><strong>注意：</strong> 2秒后才会显示结果。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/edwji5vauypoezj3bxdk.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>如果你想知道我们是如何从 stock 变量中采摘草莓的，下面是代码：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ia38z3x6b96xpq3aid91.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>不删除任何代码。现在，我们将使用以下代码开始编写生产函数。我们将使用箭头函数。</p>
<pre><code class="language-javascript">let production = () =&gt;{

  setTimeout(()=&gt;{
    console.log("production has started")
  },0000)

};
</code></pre>
<p>结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5yskzvg7rezo2sg4lklq.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>我们将在现有的 <code>setTimeout</code> 函数中嵌套另一个 <code>setTimeout</code> 函数来切水果：</p>
<pre><code class="language-javascript">let production = () =&gt;{
  
  setTimeout(()=&gt;{
    console.log("production has started")


    setTimeout(()=&gt;{
      console.log("The fruit has been chopped")
    },2000)


  },0000)
};
</code></pre>
<p>结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4659l1mua0rv40rwyem7.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>如果你还记得，这是我们的步骤：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rphpp2lqjnk7f0tv5g3d.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>图表包含制作冰淇淋的步骤</strong></p>
<p>让我们通过在另一个函数中嵌套一个函数来完成我们的冰淇淋生产 - 这也叫作回调，还记得吗？</p>
<pre><code class="language-javascript">let production = () =&gt;{

  setTimeout(()=&gt;{
    console.log("production has started")
    setTimeout(()=&gt;{
      console.log("The fruit has been chopped")
      setTimeout(()=&gt;{
        console.log(`${stocks.liquid[0]} and ${stocks.liquid[1]} Added`)
        setTimeout(()=&gt;{
          console.log("start the machine")
          setTimeout(()=&gt;{
            console.log(`Ice cream placed on ${stocks.holder[1]}`)
            setTimeout(()=&gt;{
              console.log(`${stocks.toppings[0]} as toppings`)
              setTimeout(()=&gt;{
                console.log("serve Ice cream")
              },2000)
            },3000)
          },2000)
        },1000)
      },1000)
    },2000)
  },0000)

};
</code></pre>
<p>控制台结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5mq9bg6fqrc8apj7nu7b.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>感到疑惑吗？</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/man5l5pwavp9prio1wc0.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>这叫作回调地狱，它看起来像这样（还记得上面的代码吗）：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d5rk7f8d920jzn22smjh.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>回调地狱图解</strong></p>
<p>解决方案是什么?</p>
<h1 id="promise">如何使用 Promise 来避免回调地狱</h1>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x3neys1hxsrifgg5qm6x.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>Promises 的发明是为了解决回调地狱的问题和更好地处理我们的任务。</p>
<h2 id="">休息一下</h2>
<p>先休息一下!</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bwfvel7kvm422gqvj0os.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>这就是 promise 的样子</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7qo1zheuin2825osozvc.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>promise 的格式说明</strong></p>
<p>让我们一起来剖析 promise。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gozy5r1nfubzeq5t5t25.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ezi9ogz0ergprgkmu68a.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>promise 周期的图解</strong></p>
<p>如上图所示，一个 promise 有三种状态：</p>
<ul>
<li><strong>Pending：</strong> 这是初始阶段，这里什么也没有发生。你可以这样想，你的客户正在慢慢地给你下订单，但是他们还没有点任何东西。</li>
<li><strong>Resolved：</strong> 这意味着你的顾客已经收到了他们的食物并且很高兴</li>
<li><strong>Rejected：</strong> 这意味着你的顾客没有收到他们点的单并离开了冰激凌店</li>
</ul>
<p>让我们将 promise 应用到我们的冰淇淋生产案例研究中。</p>
<h2 id="">等等</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/634b6oyglkyoccsvr8l7.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>首先，我们需要了解另外四件事 -&gt;</p>
<ul>
<li>时间和工作的关系</li>
<li>Promise 链</li>
<li>错误处理</li>
<li><code>.finally</code> 函数</li>
</ul>
<p>让我们开始我们的冰淇淋店，一步一步地理解这些概念。</p>
<h2 id="">时间和工作的关系</h2>
<p>如果你还记得，这就是我们制作冰淇淋的步骤和时间</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rphpp2lqjnk7f0tv5g3d.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>图表包含制作冰淇淋的步骤</strong></p>
<p>为了实现这一点，让我们在 JavaScript 中创建一个变量：</p>
<pre><code class="language-javascript">let is_shop_open = true;
</code></pre>
<p>现在创建一个名叫 <code>order</code> 的函数，然后传两个名叫 <code>time, work</code>的参数：</p>
<pre><code class="language-javascript">let order = ( time, work ) =&gt;{

  }
</code></pre>
<p>现在，我们要向客户发起 promise，"我们将给献上冰淇淋"，如下 -&gt;</p>
<pre><code class="language-javascript">let order = ( time, work ) =&gt;{

  return new Promise( ( resolve, reject )=&gt;{ } )

  }
</code></pre>
<p>我们的 promise 有两个部分：</p>
<ul>
<li>Resolved - 用户拿到了冰激凌</li>
<li>Rejected - 用户没有拿到冰激凌</li>
</ul>
<pre><code class="language-javascript">let order = ( time, work ) =&gt; {

  return new Promise( ( resolve, reject )=&gt;{

    if( is_shop_open ){

      resolve( )

    }

    else{

      reject( console.log("Our shop is closed") )

    }

  })
}
</code></pre>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3wik2xel68yue93yapm6.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>让我们在 <code>if</code> 语句中使用 <code>setTimeout()</code> 函数在 promise 中添加时间和工作因素。</p>
<p><strong>注意:</strong> 在现实生活中，你也可以避免时间因素，这完全取决于你的工作性质。</p>
<pre><code class="language-javascript">let order = ( time, work ) =&gt; {

  return new Promise( ( resolve, reject )=&gt;{

    if( is_shop_open ){

      setTimeout(()=&gt;{

       // work is 👇 getting done here
        resolve( work() )

// Setting 👇 time here for 1 work
       }, time)

    }

    else{
      reject( console.log("Our shop is closed") )
    }

  })
}
</code></pre>
<p>现在，我们要用新创建的函数开始制作冰淇淋。</p>
<pre><code class="language-javascript">// Set 👇 time here
order( 2000, ()=&gt;console.log(`${stocks.Fruits[0]} was selected`))
//    pass a ☝️ function here to start working
</code></pre>
<p>2 秒后的结果是：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/erzjup8wt505j502e73n.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>很棒！</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8taajvjy6pfq35hu90nq.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h2 id="promise">Promise 链</h2>
<p>在这个方法中，我们使用 <code>.then</code> 处理后续的程序：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l27ytifkoedl22kc97lh.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>使用 .then 处理函数的 promise 链说明</strong></p>
<p>当我们的 promise 被 resolve 时, .then 处理函数返回一个 promise。</p>
<h4 id="">例子如下:</h4>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1qpeewo19qbhzj47goos.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>让我说得简单点：这类似于给某人指示，你告诉别人“先做这个，然后做那个，然后做其他的事情，然后…”，然后……，然后……”等。</p>
<ul>
<li>他的首要任务是我们原始 promise</li>
<li>一旦完成了一小部分工作，剩下的任务就返回了新的 promise</li>
</ul>
<p>让我们在项目中实现这一点。在代码的底部编写以下代码行。</p>
<p><strong>注意:</strong> 不要忘记在 <code>.then</code> 函数中写 <code>return</code> 。否则，它将不能正常工作。如果你很好奇，试着在我们完成这些步骤后去掉返回值：</p>
<pre><code class="language-javascript">order(2000,()=&gt;console.log(`${stocks.Fruits[0]} was selected`))

.then(()=&gt;{
  return order(0000,()=&gt;console.log('production has started'))
})
</code></pre>
<p>结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qhhjaakbi6zshxhi6afy.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>使用相同的系统，让我们完成我们的项目：</p>
<pre><code class="language-javascript">// step 1
order(2000,()=&gt;console.log(`${stocks.Fruits[0]} was selected`))

// step 2
.then(()=&gt;{
  return order(0000,()=&gt;console.log('production has started'))
})

// step 3
.then(()=&gt;{
  return order(2000, ()=&gt;console.log("Fruit has been chopped"))
})

// step 4
.then(()=&gt;{
  return order(1000, ()=&gt;console.log(`${stocks.liquid[0]} and ${stocks.liquid[1]} added`))
})

// step 5
.then(()=&gt;{
  return order(1000, ()=&gt;console.log("start the machine"))
})

// step 6
.then(()=&gt;{
  return order(2000, ()=&gt;console.log(`ice cream placed on ${stocks.holder[1]}`))
})

// step 7
.then(()=&gt;{
  return order(3000, ()=&gt;console.log(`${stocks.toppings[0]} as toppings`))
})

// Step 8
.then(()=&gt;{
  return order(2000, ()=&gt;console.log("Serve Ice Cream"))
})
</code></pre>
<p>结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y0d0f4ys83ctnevkbgxs.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h2 id="">错误处理</h2>
<p>当出现错误时，我们需要一种处理错误的方法。但首先，我们需要了解 promise 周期。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jlm7zwonbxszeaccyohv.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z2ajcu52rxzwq64g81vp.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>promise 周期说明</strong></p>
<p>为了捕获错误，让我们将变量改为 false。</p>
<pre><code class="language-javascript">let is_shop_open = false;
</code></pre>
<p>也就是说我们的店关门了，我们不再卖冰淇淋给顾客了。</p>
<p>为了处理这种情况我们使用 <code>.catch</code> 函数，类似 <code>.then</code>，它也返回一个promise，但只有当我们最初的 promise 被 reject 时才会执行。</p>
<p>这里有一个小提示：</p>
<ul>
<li><code>.then</code> 在 promise resolved 时候被执行</li>
<li><code>.catch</code> 在 promise rejected 时候被执行</li>
</ul>
<p>到代码最底部，编写以下代码：</p>
<p>记住在<code>.then</code> 和 <code>.catch</code>之间不能有任何东西。</p>
<pre><code class="language-javascript">.catch(()=&gt;{
  console.log("Customer left")
})
</code></pre>
<p>结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lot6engklu29y05q8xyr.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>关于这段代码，有两点需要注意：</p>
<ul>
<li>第一个信息是从 <code>reject()</code> 部分来的</li>
<li>第二个信息是从 <code>catch()</code> 部分来的</li>
</ul>
<h2 id="finally">如何使用 .finally() 函数</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gdq3i0agj4volq46ycue.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>有一个叫作 “finally” 的函数，不管我们的 promise 是被 resolve 了还是被 reject 了，它都会被执行。</p>
<p><strong>例如:</strong> 不管我们是没有顾客还是有 100 个顾客，我们的店都会在一天结束的时候关门。</p>
<p>如果您想对此进行测试，请在最下面编写以下代码：</p>
<pre><code class="language-javascript">.finally(()=&gt;{
  console.log("end of day")
})
</code></pre>
<p>结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t2j3jf2uofip1d6y2rtt.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>请大家欢迎 Async/Await~</p>
<h1 id="asyncawaitjavascript">Async/Await 如何在 JavaScript 中运行</h1>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ra7483f90b69pjl2cbae.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>这应该是编写 promise 的更好方式，它可以帮助我们保持代码的简单和干净。</p>
<p>你所要做的就是在任何常规函数之前写 <code>async</code> 关键字，它就变成了一个 promise。</p>
<h2 id="">先休息一下</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4vujyfxz7dg41jhjtcrx.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>让我们来看一看：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/17f08ygj1odk28hgl9eq.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h2 id="javascriptpromisesvsasyncawait">JavaScript 中 Promises vs Async/Await</h2>
<p>在 async/await 之前，为了写一个 promise，我们这样写:</p>
<pre><code class="language-javascript">function order(){
   return new Promise( (resolve, reject) =&gt;{

    // Write code here
   } )
}
</code></pre>
<p>现在使用 async/await，我们可以这么写：</p>
<pre><code class="language-javascript">//👇 神奇的关键字
 async function order() {
    // Write code here
 }
</code></pre>
<h2 id="">等等...</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t1pjzw6zl0h21tyyh9u3.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>你必须理解-&gt;</p>
<ul>
<li>如何使用 <code>try</code> 和 <code>catch</code> 关键字</li>
<li>如何使用 <code>await</code> 关键字</li>
</ul>
<h2 id="trycatch">如何使用 Try 和 Catch 关键字</h2>
<p>我们使用 <code>try</code> 关键字来运行代码，同时使用 <code>catch</code> 来捕获错误。这和我们看 promise 时看到的概念是一样的。</p>
<p>让我们来比较一下。我们来看一个小 demo，然后开始编码。</p>
<h3 id="jspromiseresolvereject">JS 中的 Promise -&gt; resolve 和 reject</h3>
<p>我们在 resolve 中这样使用 resolve 和 reject：</p>
<pre><code class="language-javascript">function kitchen(){

  return new Promise ((resolve, reject)=&gt;{
    if(true){
       resolve("promise is fulfilled")
    }

    else{
        reject("error caught here")
    }
  })
}

kitchen()  // run the code
.then()    // next step
.then()    // next step
.catch()   // error caught here
.finally() // end of the promise [optional]
</code></pre>
<h3 id="jsasyncawaittrycatch">JS 中的 Async/Await -&gt; try, catch</h3>
<p>当我们使用 async/await 时，可以这么写:</p>
<pre><code class="language-javascript">//👇 神奇的关键字
async function kitchen(){

   try{
// 我们来制造一个假问题     
      await abc;
   }

   catch(error){
      console.log("abc does not exist", error)
   }

   finally{
      console.log("Runs code anyways")
   }
}

kitchen()  // 调用
</code></pre>
<p>不要慌，我们接下来将讨论  <code>await</code> 关键字。</p>
<p>现在希望你理解了 promise 和 async/await 之间的区别了。</p>
<h2 id="javascriptawait">如何使用 JavaScript 的 Await 关键字</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fry577xha7313ead96xy.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>关键字 <code>await</code> 使 JavaScript 等待，直到一个 promise reslove 时才会返回它的结果。</p>
<h3 id="javascriptawait">如何在 JavaScript 中使用 await 关键字</h3>
<p>我们回冰淇淋店去吧。我们不知道顾客更喜欢哪种配料，巧克力还是花生，所以我们需要停止机器，然后去问顾客他们想在冰淇淋上加什么。</p>
<p>注意这里只有我们的厨房被停止了，但是我们在厨房外的员工仍然会做这样的事情:</p>
<ul>
<li>洗餐具</li>
<li>清洁桌子</li>
<li>点单，等等</li>
</ul>
<h2 id="await">一个 Await 关键字代码示例</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8r5w5aapofalnq882wat.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>让我们创建一个小 promise 来询问要使用那种配料，这个过程需要 3 秒。</p>
<pre><code class="language-javascript">function toppings_choice (){
  return new Promise((resolve,reject)=&gt;{
    setTimeout(()=&gt;{

      resolve( console.log("which topping would you love?") )

    },3000)
  })
}
</code></pre>
<p>现在，让我们首先使用 async 关键字来创建 kitchen 函数。</p>
<pre><code class="language-javascript">async function kitchen(){

  console.log("A")
  console.log("B")
  console.log("C")
  
  await toppings_choice()
  
  console.log("D")
  console.log("E")

}

// 触发函数

kitchen();
</code></pre>
<p>让我们在 <code>kitchen()</code>  调用下面添加其他任务。</p>
<pre><code class="language-javascript">console.log("doing the dishes")
console.log("cleaning the tables")
console.log("taking orders")
</code></pre>
<p>结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y0dr669gewtrrd5fd86p.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>我们走出厨房问我们的顾客，“你想要哪种配料？”，与此同时，还有其他事情要做。</p>
<p>一旦他们选好了配料，我们就进入厨房，完成任务。</p>
<h3 id="">注意</h3>
<p>当使用 Async/Await 时，你也可以使用 promise 的核心部分 <code>.then</code>、<code>.catch</code> 和 <code>.finally</code>函数。</p>
<h3 id="">我们再开一家冰淇淋店吧</h3>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vzw8gp721oecwo2b3l6s.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>我们要创建两个函数 -&gt;</p>
<ul>
<li><code>kitchen</code>: 制作冰激凌</li>
<li><code>time</code>:  分配好每一项小任务所需要的时间</li>
</ul>
<p>让我们开始吧！先创建时间函数:</p>
<pre><code class="language-javascript">let is_shop_open = true;

function time(ms) {

   return new Promise( (resolve, reject) =&gt; {

      if(is_shop_open){
         setTimeout(resolve,ms);
      }

      else{
         reject(console.log("Shop is closed"))
      }
    });
}

</code></pre>
<p>现在，让我们创建我们的厨房：</p>
<pre><code class="language-javascript">async function kitchen(){
   try{

     // instruction here
   }

   catch(error){
    // error management here
   }
}

// Trigger
kitchen();
</code></pre>
<p>让我们来做个小说明，看看我们的厨房函数是否正常：</p>
<pre><code class="language-javascript">async function kitchen(){
   try{

// 执行这 1 个任务所花费的时间
     await time(2000)
     console.log(`${stocks.Fruits[0]} was selected`)
   }

   catch(error){
     console.log("Customer left", error)
   }

   finally{
      console.log("Day ended, shop closed")
    }
}

// 触发
kitchen();
</code></pre>
<p>当商店开门时，结果是这样的：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lptup827qau72e83deuv.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>当商店关门时，结果是这样的：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r8pjz1qlw58ap8pq7crz.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>到目前为止一切顺利。</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cnkgk63x51wth2byxzfe.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p>让我们完成我们的项目。</p>
<p>下面是我们的任务列表：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7wthn0jr5vw7vb02e4qg.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>图表包含制作冰淇淋的步骤</strong></p>
<p>首先，开张：</p>
<pre><code class="language-javascript">let is_shop_open = true;
</code></pre>
<p>现在在 <code>kitchen()</code> 函数中编写步骤：</p>
<pre><code class="language-javascript">async function kitchen(){
    try{
	await time(2000)
	console.log(`${stocks.Fruits[0]} was selected`)

	await time(0000)
	console.log("production has started")

	await time(2000)
	console.log("fruit has been chopped")

	await time(1000)
	console.log(`${stocks.liquid[0]} and ${stocks.liquid[1]} added`)

	await time(1000)
	console.log("start the machine")

	await time(2000)
	console.log(`ice cream placed on ${stocks.holder[1]}`)

	await time(3000)
	console.log(`${stocks.toppings[0]} as toppings`)

	await time(2000)
	console.log("Serve Ice Cream")
    }

    catch(error){
	 console.log("customer left")
    }
}
</code></pre>
<p>结果如下：</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qs9yccq9209u7m9lquju.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<h1 id="">总结</h1>
<p>恭喜你读完了本文！在本文中，你可以了解到：</p>
<ul>
<li>同步和异步系统之间的区别</li>
<li>异步 JavaScript 使用 3 种机制（callbacks、promises 和 Async/Await）</li>
</ul>
<p>这是你阅读到最后的奖励。❤️</p>
<h3 id="">欢迎提出建议和批评</h3>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/i/usxsz1lstuwry3jlly4d.png" alt="Alt Text" width="600" height="400" loading="lazy"></p>
<p><strong>YouTube <a href="https://youtube.com/c/joyshaheb">/ Joy Shaheb</a></strong></p>
<p><strong>LinkedIn <a href="https://www.linkedin.com/in/joyshaheb/">/ JoyShaheb</a></strong></p>
<p><strong>Twitter <a href="https://twitter.com/JoyShaheb">/ JoyShaheb</a></strong></p>
<p><strong>Instagram <a href="https://www.instagram.com/joyshaheb/">/ JoyShaheb</a></strong></p>
<h1 id="">致谢</h1>
<ul>
<li><a href="https://www.freepik.com/user/collections/promises-article/2046500">Collection of all the images used</a></li>
<li><a href="https://www.flaticon.com/packs/unicorn-4">Unicorns</a>, <a href="https://www.flaticon.com/packs/kitty-avatars-3">kitty avatar</a></li>
<li><a href="https://www.pexels.com/photo/brown-tabby-cat-with-slice-of-loaf-bread-on-head-4587955/">tabby cat</a>, <a href="https://www.pexels.com/photo/young-female-astrologist-predicting-future-with-shining-ball-6658693/">Astrologist Woman</a>, <a href="https://www.pexels.com/photo/woman-in-white-dress-holding-white-flower-bouquet-3981511/">girl-holding-flower</a></li>
<li><a href="https://www.vecteezy.com/vector-art/180695-people-mind-emotion-character-cartoon-vector-illustration">Character emotions</a></li>
</ul>
<!--kg-card-end: markdown--><p>原文：<a href="https://www.freecodecamp.org/news/javascript-async-await-tutorial-learn-callbacks-promises-async-await-by-making-icecream/">JavaScript Async/Await Tutorial – Learn Callbacks, Promises, and Async/Await in JS by Making Ice Cream 🍧🍨🍦</a>，作者：<a href="https://www.freecodecamp.org/news/author/joy/">Joy Shaheb</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 初入职场的开发者如何自我提升 ]]>
                </title>
                <description>
                    <![CDATA[ 前言 如果你正在阅读这篇文章，你可能刚刚开始做第一份工作——祝贺你，获得第一份工作是你在技术路上遇到的最为困难的事情之一，你一定为此付出了很多努力。 或许你还没有工作，但是你想了解可以从第一份工作中期待些什么。 不管怎么样，在这篇文章中我将阐述一些常见的担忧和问题，比如在工作中应该期待什么，以及怎样在事业上成为一名成功的开发者。 以下是我们将要讲的内容：  1. 在工作中可以期望什么（前几天/几周）  2. 你的短期到中期计划  3. 成功的心态  4. 如何成为一名优秀的初级开发者 在工作中可以期待什么 这一天终于到来了，你第一次作为一名新的开发者走进办公室（或者参加早会）。即使你很紧张，也要记住和适应你的第一天。这是非常激动人心的时刻！ 你工作的第一天很可能做流程上的事情：配置电脑，适应和培训，和一些人力资源方面的事情（如银行信息，保险等）。 让新开发者在第一天就向产品中 push 一个小实践是一种常见的做法。通常是一些小的任务，比如在公司网页上添加自己的名字和照片，或者修复网页中的一个错字。这会测试你的计算机环境是否配备良好，给你一点成就感，以及让你参与到开发团队中 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-become-an-astounding-junior-developer/</link>
                <guid isPermaLink="false">5f9b65275f583f0565090c58</guid>
                
                    <category>
                        <![CDATA[ 个人成长 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 职业发展 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 沟通 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miever ]]>
                </dc:creator>
                <pubDate>Fri, 30 Oct 2020 01:38:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2020/10/essentialiving-yvG7vDXCzDE-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="-">前言</h2><p>如果你正在阅读这篇文章，你可能刚刚开始做第一份工作——祝贺你，获得第一份工作是你在技术路上遇到的最为困难的事情之一，你一定为此付出了很多努力。</p><p>或许你还没有工作，但是你想了解可以从第一份工作中期待些什么。</p><p>不管怎么样，在这篇文章中我将阐述一些常见的担忧和问题，比如在工作中应该期待什么，以及怎样在事业上成为一名成功的开发者。</p><p>以下是我们将要讲的内容：</p><ol><li>在工作中可以期望什么（前几天/几周）</li><li>你的短期到中期计划</li><li>成功的心态</li><li>如何成为一名优秀的初级开发者</li></ol><h2 id="--1">在工作中可以期待什么</h2><p>这一天终于到来了，你第一次作为一名新的开发者走进办公室（或者参加早会）。即使你很紧张，也要记住和适应你的第一天。这是非常激动人心的时刻！</p><p>你工作的第一天很可能做流程上的事情：配置电脑，适应和培训，和一些人力资源方面的事情（如银行信息，保险等）。</p><p>让新开发者在第一天就向产品中 push 一个小实践是一种常见的做法。通常是一些小的任务，比如在公司网页上添加自己的名字和照片，或者修复网页中的一个错字。这会测试你的计算机环境是否配备良好，给你一点成就感，以及让你参与到开发团队中。</p><h3 id="--2">你的公司希望你成功</h3><p>对于一名新入职的开发者，录用你的公司知道你目前的知识和技能的局限，他们知道为了你的成长，他们需要投入大量的时间去教你和训练你。</p><p>记住，公司<em>想要你成长</em>！他们站在你这边，会投入大量的精力来发现、面试、录用你。对公司来讲，无论是在时间和金钱上都是一个昂贵的过程。他们不会把你晾到一边——那将是他们投资你的一种糟糕的方式。有些技能你一开始就能掌握，但是有些技能在专业环境之外获取是非常困难的（也不是不可能）。</p><p>既然这是你的第一份工作，可能你从来没有与使用源代码管理工具或者维护生产应用程序的大团队合作过——没有关系！这些技能在生产环境中是很容易学到的。</p><h3 id="--3">你的第一天/周</h3><p>当你的电脑设置好了，你可以使用所有你所需要的工具。你的第一个任务可能是改进一个小功能或者处理一个小 bug，这些只是让你在不同的项目中试水。</p><p>除了纯粹的技术知识之外，每个公司都有你需要掌握的领域知识或者“业务逻辑”（公司做什么产品或服务，以及是如何做的）。</p><p>如果公司有多种产品，他们可能会在每个源代码中给你一些小任务让你去探索这些产品。可能他们会在团队中给你分配一个带你或者至少在前几周为你解答问题的导师。</p><p>在最初的几周里，你只有一个目标：<em>学习，学习，再学习</em>。</p><p>学习你正在使用的技术，学习公司是如何运转的，学习怎样和你团队的成员协作。在这一阶段你的工作产出不重要，重要的是你的成长速度。</p><h3 id="--4">接触生产源代码</h3><p>当你开始接触公司的代码库，你可能会觉得非常困难。这是非常正常的——写代码比读代码容易得多。</p><p>生产代码跟你学过的教程或者练手的项目有很大不同。</p><p>首先，生产代码可能存在了数年，期间由不同的人进行开发，他们有自己的编程风格并且犯过不同的错误。</p><p>此外，软件依赖或者插件可能比你以前遇到的更多，你可能需要处理一些教程文档中没有讲过的不常发生的事例（比如错误处理）——这是一个真正的应用程序。</p><p>一开始你可能会不知所措，但是阅读别人的代码是你必须提升的技能，你会在你的整个职业生涯中用到它（在文章末尾，我会给你一些关于此技能的建议和帮助）。</p><p>最后，不要害怕寻求帮助！你的同事会支持你，在过去的某一个时候，他们可能也在问相同的问题。</p><h3 id="--5">对于新开发者的期待</h3><p>首先，公司并<em>不会</em>指望你能够迅速适应，去开发新功能。他们知道你需要时间去学习你还没有掌握好的技术，比如熟悉源代码，如何有效进行团队合作。</p><p>你的领导可能会与你碰面来制定 30/60/80 天计划，如果他们不这样做，你可以主动询问！任何领导都会欣赏你拥有自己的工作规划。</p><p>在起初 30 天，你可能通过写一个小需求或者处理一些小 bug 来熟悉公司产品和代码。60 天的时候，你可能会做稍微大一点的功能以及 bug 修复。到 90 天的时候，范围会扩大一点，但是他们还是不会期望你独自负责大的功能。</p><p>公司希望你能不断学习和吸收身边的信息。你不可能什么都知道，也不可能在 90 天后都知道，没关系，一天天慢慢来。</p><h3 id="--6">新开发者的思维模式</h3><p>进入一家新的公司，有很多东西你没法控制，但是有一个你可以控制的非常重要的事情，那就是你的心态。 <strong>你每天所想、实践以及你如何内化发生在你身边的事情将决定你的成功。</strong></p><p>有时候你会困惑，有时候你会感到不知所措，有时候你甚至会怀疑你是否能做到（我确实这么想过）。你如何消化这些想法很重要。记住，这些问题不仅只有你会遇到，所有新开发者都要面对。保持冷静，你会成功的。当你遇到令你困惑或沮丧的事情时，端正你的想法：<em>这个障碍是一个学习的机会</em>。</p><p>这是一个了解新事物和成长的机会。在这个过程中你可能会很痛苦，但不久之后，你会成为一名好的开发者。这就是在面对新事物时需要面对的现实。</p><p>不要说：</p><blockquote>“我今天被困住了 10 次”</blockquote><p>而应该尝试说：</p><blockquote>“今天我有 10 次学习的机会”</blockquote><p>这是非常有力的转变，你的同事会看到，你的工作表现也会证明。</p><p>保持头脑清醒，不要让失败的感觉悄悄潜入，这不仅能帮助你在这种情况下表现得更好，而且还能在你摆脱这种情况时增加你的知识和技能。深呼吸，放轻松，寻求帮助并坚持下去。</p><p>在一天结束的时候，轻松地耸耸肩。在当天你离开办公室或者关闭电脑的时候，把它忘了。开始全新的第二天，准备迎接新一天的挑战。</p><p>还有，记住庆祝一路走来的小的成功！随着时间的推移，这些小成功会积累成为巨大的成功之山。</p><p>还有一件重要的事情你要记住：<strong>给你自己犯错误的空间。</strong>你会搞乱代码，你会做一些糟糕的数据库更新（我就犯过这种错）——这些都是可以恢复的，不是世界末日，也不是你工作的结束。任何有经验的开发人员都会犯这些错误，这只是过程的一部分。</p><h3 id="--7">新开发者最好的技能</h3><p>你可能没有意识到，作为一名新的开发人员，最好的技能是<strong>学习如何去学习</strong>。</p><p>你已经学会了如何处理困难、复杂、模糊的问题，并将它分成块，一步一步地解决。</p><p>无论你学 JavaScript、React、Ruby 或者其他任何东西，你学到最好的事情是如何自学。多利用你掌握的这个技能并每天都实践它。</p><h2 id="--8">拥抱自己的成长</h2><p>对于处于职业生涯任何阶段的开发人员来说，这可能是最重要的：<strong>你的事业是你自己的，你必须拥抱它，你必须管理自己的成长。</strong></p><p>有时你的公司、职位或老板会帮助促进你成长，但最终还是取决于你。大多数公司都有某种固定的审查程序，可能是季度或年度。如果他们有，那很好。如果没有，管理自己的成长！定期征求上司的意见，并按他们说的去做。如果有人提到了你从未听说过的东西，问问他们，或者自己去研究一下。</p><h3 id="--9">“微小收益的力量”</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://camo.githubusercontent.com/818f9a1eb06a29be31ff3d16fc6959ed8675e710/68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032302f30352f6e65775f646576656c6f7065722e3032372e6a706567" class="kg-image" alt="https://jamesclear.com/marginal-gains" width="600" height="400" loading="lazy"><figcaption><a href="https://jamesclear.com/marginal-gains" rel="nofollow">https://jamesclear.com/marginal-gains</a></figcaption></figure><p>我最喜欢的书之一—— <a href="https://jamesclear.com/atomic-habits">James Clear 的《<em><em>Atomic Habits</em></em>》</a>，有一个非常棒的图表标题叫 “微小收益的力量”。这是一个简单的图表，它显示了每天 1% 的<em>提高</em>和 1% 的<em>下降</em>之间的差异。</p><p>如果你每天都有 1% 的提高，一年之后，你会比年初好 38 倍！这就是“微小收益”的力量，对于成为一名伟大的软件开发人员来说也是如此。</p><p>每天你都有机会学习新东西，不管它有多小，也许是一个你不知道的数组上的新函数，一种不同的 CSS 结构化方法，一个新的文本编辑器快捷方式，或者是一些全新的东西，比如学习 SQL 以及如何在数据库级别存储数据。</p><p>无论如何，每天提高 1%（大多数日子你会做得更多），你职业生涯最初几年的成长将是惊人的。</p><h3 id="--10">每天一页</h3><figure class="kg-card kg-image-card"><img src="https://camo.githubusercontent.com/28745cf448e8731520afdef2ddf9478c0a650aed/68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032302f30352f53637265656e2d53686f742d323032302d30352d32392d61742d31302e31302e32332d414d2e706e67" class="kg-image" alt="68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032302f30352f53637265656e2d53686f742d323032302d30352d32392d61742d31302e31302e32332d414d2e706e67" width="600" height="400" loading="lazy"></figure><p>我曾经在一档程序员播客上听说过一个故事，讲的是一位为 Ruby 维护<code>pg</code> gem 的人。<code>pg</code> gem 是 Ruby 和 Postgresql 之间的一个接口。这是一个相当严肃的事情，因为大多数 Ruby 开发人员每天都在使用它。</p><p>他如何成为 gem 的维护者的故事非常有趣。他说刚开始的时候，他会打开 Postgresql 文档并阅读一页——每天只读一页。</p><p>随着时间的推移，他对 Postgresql 有了广泛的了解，并开始为 <code>pg</code> gem 做贡献。过了一段时间，他成为了 gem 的维护者。</p><p>这是积累点滴的完美例子——每天一页就够了。我们每个人都可以做到这一点，我鼓励你将同样的理念应用到你正在使用的任何语言或系统中。</p><h3 id="--11">实践出真知</h3><p>你以前可能听说过这个短语：<em>实践出真知</em>。</p><p>我的钢琴老师使用了不同的短语：<strong>正确的</strong>实践出真知。</p><p>我认为他说得对，我可能会用错误的方式练习钢琴，如：用糟糕的技术，马虎，没有稳定的节奏，结果就是马虎的钢琴演奏。</p><p>重要的不只是实践，而是你<em>如何</em>实践。我可以一遍又一遍地练习一首歌曲的第一小节，并把它写得很完美。但如果我只关注第一小节，我就永远学不会这首歌。我可能可以以世界级钢琴家的水平演奏这首歌的第一小节，但我想弹钢琴，所以我不得不学习整首歌。</p><p>这对于开发来说是一个完美的对比。你实践开发的方式（你的日常习惯、开发方法以及路线）决定了你将成为什么样的开发人员。</p><p>一开始你会犯很多错误（每个人都会犯），但是如果你对你的工作上心，你就会发现你有可以改进的地方。这些都是完美的练习时刻，是学习新东西或以更好的方式做某事的机会。</p><p>当你从现在开始回顾十年的职业生涯时，你想要的应该是十年的成长、实践和学习，而不是一年的成长、实践和学习，经历十次。</p><p>所以去问那些愚蠢的问题，问那些可能显而易见的问题。当别人提到一些你不知道的事情时，大胆地问“那是什么”，我希望他们能以一种和蔼可亲的方式回应。无论如何，你都要做好学习的准备。</p><p>这一切都会见证你的成长。</p><h2 id="t-">T 字型的人</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://camo.githubusercontent.com/4571ed9e22c32ec9aec3582eacf389ad1a408865/68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032302f30352f6e65775f646576656c6f706572322e3030312e6a706567" class="kg-image" alt="A &quot;T-shaped&quot; person" width="600" height="400" loading="lazy"><figcaption>一个 T 字型的人</figcaption></figure><p>在你的开发生涯开始时，你可以从了解许多方向中获益，因此你希望努力学习多个学科的知识。</p><p>如果你立志成为一名全栈工程师，你可能需要掌握 HTML、CSS、JS、一种你想使用的后端语言、SQL、Git 等。在每一个方向中都有比较容易获取的知识，你可以慢慢进行吸收。</p><p>随着时间的推移，你会发现你最喜欢哪种开发，可能是前端、后端、数据库、运维、设计或者这些和其他的一些组合。</p><p>随着你事业的发展，你会开始成为 T 字型人才。T 字型人才，就像字母 “T”，指对很多事物有广泛而浅显的了解，而在一些领域有丰富的知识和经验。</p><p>这种深刻的认识需要一段时间来建立，每一步都要比前一步付出更多的努力，这正是你在精通一门学科时的事实。在开始的时候，在广泛的学科领域里，掌握所有那些初学者容易掌握的东西。</p><p>拥有 T 字型的能力将帮助你成为一个更好的开发者了解数据库模式的前端开发人员，或者了解如何在前端将数据库表用作模型的后端开发人员，将比那些只局限于自己领域的人更有见识，也更能成为好的团队成员。</p><p>在开始阶段，对开发的各个方面的小尝试也有助于找到吸引你的东西，并给你一个软件世界中更大的蓝图。</p><p>追随你的兴趣，保持求知欲!</p><h2 id="--12">给新开发者的一个建议</h2><p>现在我们已经介绍了你的期望以及如何考虑它们，这里有一些实用的技巧可以帮助你成为一名优秀的开发人员，一名团队成员喜欢与之共事的开发人员。</p><h3 id="-1-">#1 沟通是非常非常重要的</h3><p>第一天上班时，你可能没有令人惊讶的开发知识和技能，但你<em>可以</em>有令人惊讶的沟通技巧。</p><p>作为一名新开发人员，你将需要大量的帮助和指导。没关系，这里有一个如何有效地寻求帮助的小窍门。</p><p>被困住是令人沮丧的（对我来说就是这样）。这种挫败感很容易将你压倒，你可以向旁边的同事请教（或者通过电子邮件和聊天应用）。</p><p>类似：</p><blockquote>“我困住了”</blockquote><blockquote>“显示错误”</blockquote><blockquote>“页面不能加载”</blockquote><p>现在退一步，从你请求帮助的那个人的角度来看待这个问题。像<em>“页面无法加载”</em>这样的信息对这个人毫无帮助。没有上下文，没有信息可以让他们继续。事实上，他们还得向你<em>获取更多的信息</em>。这样做效率非常低，而且会让试图帮助你的人非常沮丧。</p><p>寻求帮助的一个更好的方式是像填词游戏一样思考（如果你还记得 freeCodeCamp 课程中有一道这样的题目的话）：</p><blockquote>我正在做 _____，但是在我尝试_____的时候，却发生了____。</blockquote><blockquote>我试着_____，_____和_____，我发现_____ 和 _____。</blockquote><p>举个例子：</p><blockquote>我正在处理<strong>用户密码重置错误的 bug</strong>，但是当我尝试<strong>生成密码重置链接时</strong>，<strong>用户的令牌已经为空</strong>。</blockquote><blockquote>我看过<strong>令牌是在哪设的</strong>，我发现<strong>令牌在数据库中</strong>，但是<strong>这个令牌在文件 Y 的 X 行上丢失了。</strong></blockquote><p>如果你给别人发了上面的信息，他们可以理解:</p><ul><li>你在做什么</li><li>问题是什么</li><li>你已经试过了什么</li><li>问题发生在哪</li></ul><p>对于你寻求帮助的人来说，这是一个丰富的信息。他们会<strong>非常</strong>感激你给了他们如此清晰的信息，并且你已经尝试自己去解决它，这让他们知道你尊重他们的时间，而不是你在等待他们简单的施舍。</p><p>寻求帮助并没有错，但是如果有人只是帮你解决问题，他们实际上是在剥夺你学习和成长的机会。</p><p>这并不是说你必须解决这十个问题，然后你就再也不会遇到问题了。作为一名开发人员，你每天都会遇到问题。所以最好的结果是，他们给你足够的帮助让你摆脱困境，但允许你自己独自解决问题。</p><h3 id="-2-">#2 用好谷歌</h3><p>就像在武术中施展技能一样，作为一名开发人员，随着时间的推移，你将施展谷歌的才能，这就是用谷歌搜索答案的艺术。这是每个有经验的开发人员都拥有的一项真正的技能，它是随着时间的推移而开发出来的。</p><p>有时，你只需要直接键入你所遇到的问题（这对报错非常有效）：</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://camo.githubusercontent.com/c11fee08f72cafbce244262a6515c1129bc81a9f/68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032302f30352f6e65775f646576656c6f7065722e3034312e6a706567" class="kg-image" alt="有时粘贴整个错误消息可以得到结果" width="600" height="400" loading="lazy"><figcaption>有时粘贴整个报错信息就可以解决</figcaption></figure><p>有时，搜索准确的错误信息将产生正确的结果，正如上面所做的。你遇到了一个技术问题，其他人也遇到过完全相同的问题。</p><p>但有时你需要对搜索信息进行一些编辑，以删除特定项目的信息：</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://camo.githubusercontent.com/103996da6677e8d7cbc920fd425424c918cd3f0d/68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032302f30352f6e65775f646576656c6f7065722e3034322d312e6a706567" class="kg-image" alt="太多特定于项目的信息不会得到结果" width="600" height="400" loading="lazy"><figcaption>有太多特定于项目的信息你不会得到一个满意的结果</figcaption></figure><p>如上图，谷歌从未在 <code>gotta_catchem_all.rb</code> 文件中见过 <code>whos_that_pokemon_its_pikachu()</code> 这个函数（但是我仍然还在搜索它）。删除特定项目的信息并添加通用信息将会返回更好的结果。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://camo.githubusercontent.com/bb51eab244a3403958befba870be3d2c4e68b31b/68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032302f30352f6e65775f646576656c6f7065722e3034332d312e6a706567" class="kg-image" alt="基本的通用错误" width="600" height="400" loading="lazy"><figcaption>基本的通用错误</figcaption></figure><h3 id="-3-">#3 尝试使用计时器</h3><p>作为一名新开发人员，你会遇到很多困难。可能会出现以前你从未见过的错误消息，如何处理这些情况将决定你作为开发人员的成长速度。</p><p>尽管这可能是非常令人沮丧的时刻，这些是你学习和成长的时刻。你不能通过一遍又一遍地做同样的工作来学习，只有在经历坎坷的过程中才能成长。</p><p>当你遇到其中一个问题时，请花些时间尝试并自己解决它。有些公司会把这句话作为培训的一部分来告诉你，比如“30 分钟后再寻求帮助”。在其他一些公司，虽然没有这么明确，但这个提示依然适用：尽你所能。如果你还是卡住了，那就寻求帮助。</p><p>这不仅让你有机会弄清楚，而且也是尊重在专注于自己的工作的团队成员的时间。因为一些你本可以很快意识到的事情而去打断别人，这将对团队来说是一种净损失。</p><p>所以好好尝试一下，然后再寻求帮助!</p><p>下面是成为一名优秀的新开发人员的秘诀：<strong>总是重置计时器</strong>。</p><p>假设你被困住了，尝试了 30 分钟，然后再去寻求帮助。下次你被困住的时候，去寻求帮助之前，<strong>再试 30 分钟</strong>。</p><p>显而易见，当你觉得你遇到了一个又一个问题的时候，你会感到沮丧，你会想要在遇到下一个问题之前寻求帮助，这是很自然的。</p><p>深呼吸，去快走一会儿，用全新的视角来看待每一个问题。</p><p>（当然，说起来容易做起来难！）</p><h3 id="-4-">#4 记住放松和休息</h3><p>记住，当事情开始让你感到难以承受时，要休息一下。</p><p>去散个步，接杯水，如果可以的话，放一个晚上。有时候仅仅睡一觉或者动一动就可以帮助你重新调整自己。</p><p>请记住，每个开发人员都曾经历过你这种情形，你会度过难关的。</p><p>在某种程度上来讲，开发总是令人沮丧，你永远不会停止犯错或者不再遇到问题。但随着时间的推移，你会越来越擅长处理这些问题，你解决这些问题的信心也会增强，所以这些问题对你的困扰会越来越少。</p><h3 id="-5-">#5 小黄鸭调试法</h3><p>你是否曾向某人发邮件或短信描述你遇到的一个问题，然后在你点击发送之前你已经知道了解决方法？在软件世界里有这样一个短语：<em>小黄鸭调试法</em>。</p><p>这个名字是引用了《实用程序员》一书中的一个故事。在这个故事中，一个程序员带着一只橡皮鸭，通过强迫自己一行一行地向橡皮鸭解释代码来调试他的代码。</p><p>通过写电子邮件或与另一个人交谈，你被迫整理整个上下文逻辑，以便让另一个人理解发生了什么。</p><p>用这种方式解释这个问题， <em>你自己</em>必须有逻辑地思考和整理。仅仅是试着为别人准备上下文的行为就会让你从不同的角度来思考问题，很多时候你自己就会找到解决方案。</p><p>回到尝试使用计时器，在你寻求帮助之前，试着用你没有发送的邮件解释问题的概要。你很有可能在不打扰别人的情况下对这个问题有了新的见解，最糟糕的情况是，你有一封很好的邮件或聊天信息要发送给他们（我也见过很多人把真正的橡皮鸭放在桌子上！）</p><h3 id="-6-">#6 记笔记</h3><p>这个建议可能看起来很明显!</p><p>当你第一次加入一家公司的时候，你会接触到很多不同的东西：源代码、产品、人、业务逻辑，不可能把这些全部记住，所以把这些东西写下来。</p><p>当我开始我的第一份工作时，我的老板告诉我他可以向我解释任何事情，但是他不想解释两次。那时候我明白，但 8 年后的今天我真才真正明白，这是在尊重你的团队成员以及他们的时间。</p><p>如果他跟我解释了某件事情，我却忘了，我们就浪费了彼此的时间，所以只能再问他一遍。在他的建议下，我甚至开始在我的显示器上贴物理便利贴，记下我想经常遇到和需要记住的事情，就像：</p><ul><li>尝试 30 分钟</li><li>在请求 PR 评审之前，检查构建是否通过</li><li>确保你有最新的代码</li></ul><h3 id="-7-">#7 每天与冒名顶替综合症作斗争</h3><p>如果你不知道什么是冒名顶替综合症，你的脑海里这样想:</p><p>我不属于这里，我是一个冒名顶替者。除了我，其他人都知道这一点。</p><p>这是一种你每天都要与之抗争的心态。作为一名开发人员，会有令人沮丧的时候，但是你已经面对过挫折并努力克服了它。每个开发人员都有这种感觉，而且这种感觉也会过去的。</p><p>实际上，冒名顶替综合症看起来更像这样:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://camo.githubusercontent.com/8ce7a2f6f71bff1b05ba1dc5e2ac7ee23231b828/68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032302f30352f696d706f737465725f2e706e67" class="kg-image" alt="骗子综合症 " width="600" height="400" loading="lazy"><figcaption>冒名顶替综合症</figcaption></figure><h2 id="--13">“高级”和“初级”开发者之间的一个关键区别</h2><p>当然，高级开发人员比新开发人员有更多的知识和经验，但这并不是他们的根本区别。一个高级开发人员有一个<strong>解决问题体系</strong>。</p><p>当我第一次开发时，我想我最终会停止犯错误——停止遇到报错。</p><p>相反，我每天仍然会犯很多错误：错误的语法，错误的文件，错误的函数。</p><p>我没有停止犯错误——<em>我只是很快就修复了。</em></p><p>这是一种随着时间发展而来的技能，需要有意识地解决问题。</p><p>这里有一些关于如何构建这个体系的提示。</p><h2 id="5-">5个调试技巧</h2><h3 id="-1--1">#1 不要盲目敲代码</h3><p>我看到许多新开发人员遇到问题时会开始疯狂的开始改代码（我是新开发者的时候也这么做过）。他们没有系统的代码评估过程，只是对代码做大量的修改，看看这样是否能解决问题。</p><p>这是一个很坏的习惯，这样做只会犯更多的错误。你应该做的是:</p><h3 id="-2--1">#2 读错误信息</h3><p>这个建议似乎很明显，但实际上是在<em>读取</em> 信息。错误是什么？发生这个错误的文件是什么？错误产生在哪一行？这些都是至关重要的信息。</p><p>如果你不愿意快速更改代码的话，你可以直接跳到错误产生的地方。</p><p>这是有经验的开发人员的方式：读取消息然后直接找到问题所在。</p><p>这样做会为你节省大量的时间和精力。</p><h2 id="-3--1">#3 不要把时间浪费在不可能的事情上（或者是至少不可能的事情）</h2><figure class="kg-card kg-image-card"><img src="https://camo.githubusercontent.com/36a41cbcb3139c7a9de34d3d197cb44221d45da7/68747470733a2f2f7777772e66726565636f646563616d702e6f72672f6e6577732f636f6e74656e742f696d616765732f323032302f30352f6e65775f646576656c6f7065722e3035392e6a706567" class="kg-image" alt="不要把时间浪费在不可能的事情上！" width="600" height="400" loading="lazy"></figure><p>我看到的新开发人员会经常做这样一件事：他们在代码中遇到错误，然后在代码中发现了一些他们认为是问题的东西，然后不相信这有问题。举个例子：</p><p>"我发现问题出现在第 14 行，它会检查 <code>is_admin"</code> 变量是否为真，但是它不是真，然而用户确实<em><strong>是</strong></em>管理员！</p><p>他们是这么思考这个问题，<em>“这怎么可以！”</em> ，而不是 <em>“为什么会这样？”</em></p><p>有时候你会遇到核心语言或框架的 bug，但在 99.9% 的情况下， <strong>你可能是做错了什么，或者情况并不像看上去的那样。</strong></p><p>有些事并不像看上去的那样，被不可能的事情吓到只是在浪费时间。开始解决问题吧，不要在眼前不可能展开的事情上花时间，质疑你对情况的假设。</p><h3 id="-4--1">#4 “当有疑问时，打印更多的信息”</h3><p>我不知道最初是谁说的，但这是最有效的调试技术之一。当你不知道发生了什么情况时，开始在你认为发生问题的地方打印程序的相应信息。</p><p><code>user</code> 变量中有什么？HTTP 请求的响应是什么？在这种情况下，我们使用了 <code>if</code> 或 <code>else</code> 分支吗？我们调用过这个函数吗？是否在此页面？</p><p>我见过无数的开发人员尝试调试和修复一个问题的时候（我自己也做过很多次），他们甚至没有在正确的文件中进行调试。快速打印或者在“控制台”中可以显示你实际上正在查看实际运行的代码。</p><h3 id="-5--1">#5 一次只做一件事</h3><p>每个新开发人员都会犯的一个常见错误是：<strong>一次做的事情太多了。</strong></p><p>他们想要编写 30 分钟的代码，单击运行，然后查看结果。他们发现，花了 30 分钟来编写 bug 和错误，现在修复起来简直是一场噩梦。</p><p>当我在应用程序中新建一个页面时，我做的第一件事就是把<code>&lt;p&gt;hi&lt;/p&gt;</code>标签放到页面上。我想确定我所有内部代码设置是正确的，以至我可以在页面上看到<code>hi</code>。我一次只做一件事。</p><p>一次只做一件事。在页面上看到 <em>“hi” </em>显示。接下来获取用户输入，接下来保存输入。如果你一步一步来，你就知道问题发生在哪里，该如何解决。</p><p>即使在从事开发工作 8 年后，我仍然是一步一步来。我知道我将会犯很多错误，而且我想<em>立即</em>知道这些错误在何时何处发生的。</p><h2 id="--14">总结</h2><p>读完这篇文章，你已经了解了很多，但是你还有很多知识得学，很多技能需要提升，也有很多乐趣和有益的工作在等着你。</p><p>抬头挺胸，记得要休息。每天提高 1%，一年之后你就会对结果感到惊讶。</p><p>感谢阅读！</p><p>原文：<a href="https://www.freecodecamp.org/news/how-to-become-an-astounding-junior-developer/">How to Become an Outstanding Junior Developer</a>，作者：John Mosesman</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
