<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Hexo</title>
  
  
  <link href="https://wukong1024.github.io/atom.xml" rel="self"/>
  
  <link href="https://wukong1024.github.io/"/>
  <updated>2024-12-20T23:45:05.000Z</updated>
  <id>https://wukong1024.github.io/</id>
  
  <author>
    <name>John Doe</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>2024年细讲前端工程化</title>
    <link href="https://wukong1024.github.io/2024/12/19/2024-%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96/"/>
    <id>https://wukong1024.github.io/2024/12/19/2024-%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%8C%96/</id>
    <published>2024-12-19T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="何为前端工程化"><a href="#何为前端工程化" class="headerlink" title="何为前端工程化"></a>何为前端工程化</h1><p>前端工程化是指将软件工程的原理和方法应用到前端开发中，以提高开发效率、代码质量和可维护性。随着 Web 应用的复杂度不断增加，传统的前端开发方式已经难以满足需求，因此引入了工程化的概念来更好地管理和优化前端开发流程。前端工程化主要包括以下几个方面：</p><h3 id="1-项目构建工具"><a href="#1-项目构建工具" class="headerlink" title="1. 项目构建工具"></a>1. <strong>项目构建工具</strong></h3><p>使用自动化构建工具（如 Webpack, Vite, Parcel 等）来处理和打包前端资源（JavaScript, CSS, 图片等），从而简化开发流程，提升开发体验。这些工具通常支持模块化开发、代码压缩、混淆、热更新等功能。</p><h3 id="2-模块化开发"><a href="#2-模块化开发" class="headerlink" title="2. 模块化开发"></a>2. <strong>模块化开发</strong></h3><p>采用模块化的开发模式（如 ES6 模块、CommonJS、AMD 等），可以将代码拆分为更小、更易于管理的部分，有助于团队协作和代码复用。每个模块负责单一功能，并且通过明确的接口与其他模块交互。</p><h3 id="3-组件化开发"><a href="#3-组件化开发" class="headerlink" title="3. 组件化开发"></a>3. <strong>组件化开发</strong></h3><p>基于组件的思想构建用户界面，比如 React、Vue 和 Angular 中的组件。组件是独立且可复用的 UI 构建块，它们封装了自身的逻辑和样式，可以在不同的页面或应用之间共享。</p><h3 id="4-版本控制"><a href="#4-版本控制" class="headerlink" title="4. 版本控制"></a>4. <strong>版本控制</strong></h3><p>利用 Git 或其他版本控制系统来跟踪代码的变化历史，方便团队成员之间的协作开发，确保项目的稳定性和可回溯性。</p><h3 id="5-持续集成-持续部署-CI-CD"><a href="#5-持续集成-持续部署-CI-CD" class="headerlink" title="5. 持续集成/持续部署 (CI/CD)"></a>5. <strong>持续集成/持续部署 (CI/CD)</strong></h3><p>设置 CI/CD 流程自动化测试、构建和部署过程，保证每次代码变更都能经过严格的测试并顺利上线，减少人工操作带来的风险。</p><h3 id="6-静态代码分析"><a href="#6-静态代码分析" class="headerlink" title="6. 静态代码分析"></a>6. <strong>静态代码分析</strong></h3><p>通过 ESLint、Prettier 等工具进行静态代码分析，帮助开发者遵循编码规范，提前发现潜在的问题，如语法错误、风格不一致等。</p><h3 id="7-性能优化"><a href="#7-性能优化" class="headerlink" title="7. 性能优化"></a>7. <strong>性能优化</strong></h3><p>采取各种措施优化 Web 应用的加载速度和运行性能，例如图片懒加载、服务端渲染（SSR）、客户端缓存策略、减少 HTTP 请求次数、使用 CDN 分发静态资源等。</p><h3 id="8-文档生成与维护"><a href="#8-文档生成与维护" class="headerlink" title="8. 文档生成与维护"></a>8. <strong>文档生成与维护</strong></h3><p>保持良好的文档习惯，包括但不限于 API 文档、架构设计文档、开发指南等，这不仅有助于新人快速上手项目，也能为后续的维护提供便利。</p><h3 id="9-依赖管理"><a href="#9-依赖管理" class="headerlink" title="9. 依赖管理"></a>9. <strong>依赖管理</strong></h3><p>合理地管理和更新第三方库依赖，确保项目所使用的库是最新的同时避免引入不必要的安全漏洞。常用工具如 pnpm、npm、yarn 可以有效地管理 JavaScript 包依赖。</p><h3 id="10-单元测试与集成测试"><a href="#10-单元测试与集成测试" class="headerlink" title="10. 单元测试与集成测试"></a>10. <strong>单元测试与集成测试</strong></h3><p>编写测试用例对组件的功能进行验证，保证在修改代码后不会破坏现有功能；集成测试则用于检查不同模块之间的协同工作是否正常。</p><p>通过上述措施，前端工程化旨在打造一个高效、可靠、易扩展的前端开发环境，使得大型复杂的 Web 应用程序能够更加稳健地开发和迭代。</p><h3 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h3><ul><li>  前端开发管理工具集</li><li>  降低开发成本，提升开发效率</li></ul><h2 id="何为模块化（代码的分解和聚合）"><a href="#何为模块化（代码的分解和聚合）" class="headerlink" title="何为模块化（代码的分解和聚合）"></a>何为模块化（代码的分解和聚合）</h2><p>模块化是一种软件设计原则，它提倡将一个复杂的系统分解为多个独立的、可复用的部分（即模块），每个模块负责实现特定的功能或解决特定的问题。通过这种方式，可以简化系统的复杂性，提高代码的组织性和可维护性。在前端开发中，模块化具体表现为以下几个方面：</p><h3 id="1-定义清晰的接口"><a href="#1-定义清晰的接口" class="headerlink" title="1. 定义清晰的接口"></a>1. <strong>定义清晰的接口</strong></h3><p>每个模块都应该有明确的输入和输出，这样其他部分的代码就可以方便地调用该模块而不需要了解其内部工作原理。这种做法提高了代码的解耦程度，使得各个模块之间的依赖关系更加松散。</p><h3 id="2-功能单一性"><a href="#2-功能单一性" class="headerlink" title="2. 功能单一性"></a>2. <strong>功能单一性</strong></h3><p>遵循“单一职责原则”，确保每个模块只做一件事并且做好。如果一个模块需要处理多种任务，则应该考虑将其拆分成更小的模块。这样做有助于减少错误的发生，并且便于测试和调试。</p><h3 id="3-易于测试"><a href="#3-易于测试" class="headerlink" title="3. 易于测试"></a>3. <strong>易于测试</strong></h3><p>由于模块是独立存在的，因此可以单独对其进行单元测试。这不仅加快了测试速度，也更容易定位问题所在。此外，良好的模块化设计还可以促进集成测试，以验证不同模块之间的交互是否正确。</p><h3 id="4-高内聚低耦合"><a href="#4-高内聚低耦合" class="headerlink" title="4. 高内聚低耦合"></a>4. <strong>高内聚低耦合</strong></h3><p>高内聚意味着模块内部的组件紧密相关，专注于完成某一特定功能；低耦合则表示模块之间相互依赖较少，改变一个模块不会对其他模块造成太大影响。这样的结构有利于系统的扩展和维护。</p><h3 id="5-复用性"><a href="#5-复用性" class="headerlink" title="5. 复用性"></a>5. <strong>复用性</strong></h3><p>一旦某个模块被创建并经过充分测试后，可以在不同的项目或者同一项目的不同地方重复使用这个模块，从而避免重复劳动，提升开发效率。</p><h3 id="6-代码分割与懒加载"><a href="#6-代码分割与懒加载" class="headerlink" title="6. 代码分割与懒加载"></a>6. <strong>代码分割与懒加载</strong></h3><p>在现代前端框架（如 Vue, React）中，可以通过路由级别的代码分割和懒加载技术来实现按需加载模块，减少初始加载时间，优化用户体验。</p><h3 id="7-模块化的实现方式"><a href="#7-模块化的实现方式" class="headerlink" title="7. 模块化的实现方式"></a>7. <strong>模块化的实现方式</strong></h3><h4 id="JavaScript-模块系统"><a href="#JavaScript-模块系统" class="headerlink" title="JavaScript 模块系统"></a>JavaScript 模块系统</h4><ul><li>  <strong>CommonJS</strong>：Node.js 默认采用的模块化方案，基于文件的方式定义模块，使用 <code>require()</code> 加载模块。</li><li>  **AMD (Asynchronous Module Definition)**：异步加载模块的标准，主要用于浏览器端，<code>define()</code> 和 <code>require()</code> 是它的核心方法。</li><li>  <strong>ES6 Modules</strong>：ECMAScript 标准引入的原生模块化解决方案，使用 <code>import</code> 和 <code>export</code> 关键字进行模块导入导出。这是目前最广泛接受和支持的模块化标准之一。</li></ul><h4 id="模块打包工具"><a href="#模块打包工具" class="headerlink" title="模块打包工具"></a>模块打包工具</h4><p>为了更好地管理和打包这些模块，前端开发者通常会使用构建工具（如 Webpack, Vite, Parcel 等）。它们能够解析项目中的各种资源文件（JavaScript, CSS, 图片等），根据依赖关系生成最终的输出文件。</p><h2 id="模块化标准以及解决什么问题"><a href="#模块化标准以及解决什么问题" class="headerlink" title="模块化标准以及解决什么问题"></a>模块化标准以及解决什么问题</h2><ul><li>  函数</li><li>  解决文件分解（全局污染）和聚合（依赖混乱）的问题</li></ul><h3 id="民间-社区标准"><a href="#民间-社区标准" class="headerlink" title="民间/社区标准"></a>民间/社区标准</h3><p>模块化标准是指在软件开发中，为了确保不同模块之间可以正确交互、共享资源，并且能够被有效地管理和维护而设立的一套规则和协议。特别是在前端开发领域，JavaScript 的模块化标准经历了多个阶段的发展。以下是几种主流的 JavaScript 模块化标准：</p><h3 id="1-CommonJS"><a href="#1-CommonJS" class="headerlink" title="1. CommonJS"></a>1. <strong>CommonJS</strong></h3><ul><li>  <strong>简介</strong>：这是 Node.js 中默认使用的模块系统。它基于文件的方式定义模块，每个文件被视为一个独立的模块。</li><li><strong>导入导出</strong>：<ul><li>  导入模块使用 <code>require()</code> 函数。</li><li>  导出模块成员通过 <code>module.exports</code> 或直接修改 <code>exports</code> 对象。</li></ul></li><li>  <strong>特点</strong>：同步加载模块，适用于服务器端环境。</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">// 导出模块</span><br><span class="line">module.exports = function() &#123;</span><br><span class="line">  console.log(&#x27;Hello from CommonJS&#x27;);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">// 导入模块</span><br><span class="line">const myModule = require(&#x27;./myModule&#x27;);</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="2-AMD-Asynchronous-Module-Definition"><a href="#2-AMD-Asynchronous-Module-Definition" class="headerlink" title="2. AMD (Asynchronous Module Definition)"></a>2. <strong>AMD (Asynchronous Module Definition)</strong></h3><ul><li>  <strong>简介</strong>：专门为浏览器端设计的一种异步加载模块的标准，常与 RequireJS 一起使用。</li><li><strong>导入导出</strong>：<ul><li>  使用 <code>define()</code> 定义模块，接受依赖作为参数。</li><li>  <code>require()</code> 用来加载模块。</li></ul></li><li>  <strong>特点</strong>：支持异步加载，适合浏览器环境下动态加载模块。</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">// 定义模块</span><br><span class="line">define([&#x27;dependency&#x27;], function(dependency) &#123;</span><br><span class="line">  return function() &#123;</span><br><span class="line">    console.log(&#x27;Hello from AMD&#x27;);</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">// 加载模块</span><br><span class="line">require([&#x27;module&#x27;], function(module) &#123;</span><br><span class="line">  module();</span><br><span class="line">&#125;);</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="3-UMD-Universal-Module-Definition"><a href="#3-UMD-Universal-Module-Definition" class="headerlink" title="3. UMD (Universal Module Definition)"></a>3. <strong>UMD (Universal Module Definition)</strong></h3><ul><li>  <strong>简介</strong>：UMD 是一种兼容多种模块系统的格式，旨在同时支持 CommonJS、AMD 和全局变量（即浏览器中的 <code>&lt;script&gt;</code> 标签）。</li><li>  <strong>特点</strong>：提供了跨平台的支持，使得同一个模块可以在不同的环境中无缝工作。</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">(function (root, factory) &#123;</span><br><span class="line">  if (typeof define === &#x27;function&#x27; &amp;&amp; define.amd) &#123;</span><br><span class="line">    // AMD</span><br><span class="line">    define([&#x27;b&#x27;], factory);</span><br><span class="line">  &#125; else if (typeof exports === &#x27;object&#x27;) &#123;</span><br><span class="line">    // Node, CommonJS-like</span><br><span class="line">    module.exports = factory(require(&#x27;b&#x27;));</span><br><span class="line">  &#125; else &#123;</span><br><span class="line">    // Browser globals (root is window)</span><br><span class="line">    root.returnExports = factory(root.b);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;(this, function (b) &#123;</span><br><span class="line">  // module implementation</span><br><span class="line">&#125;));</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="4-CMD-Common-Module-Definition-更常指-Sea-js-的模块定义方式"><a href="#4-CMD-Common-Module-Definition-更常指-Sea-js-的模块定义方式" class="headerlink" title="4. CMD (Common Module Definition, 更常指 Sea.js 的模块定义方式)"></a>4. <strong>CMD (Common Module Definition, 更常指 Sea.js 的模块定义方式)</strong></h3><ul><li><p>  <strong>设计目的</strong>：CMD 是由国内开发者提出的模块定义规范，主要用于 Sea.js 这样的模块加载器。它的设计理念与 CommonJS 类似，但在某些方面进行了优化，更适合浏览器环境。</p></li><li><p>  <strong>主要用途</strong>：CMD 主要用于浏览器端开发，并且 Sea.js 提供了对 CMD 的原生支持。</p></li><li><p>  <strong>实现工具</strong>：Sea.js 是最著名的 CMD 实现之一。</p></li><li><p><strong>语法特点</strong>：</p><ul><li>  使用 <code>define()</code> 来定义模块，支持按需加载和延迟执行。</li><li>  <code>require</code> 和 <code>exports</code> 用于同步加载依赖项，而 <code>require.async</code> 则用于异步加载。</li></ul></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">// 定义模块</span><br><span class="line">define(function(require, exports, module) &#123;</span><br><span class="line">  var dependency = require(&#x27;./dependency&#x27;);</span><br><span class="line"></span><br><span class="line">  exports.greet = function() &#123;</span><br><span class="line">    console.log(&#x27;Hello from CMD&#x27;);</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">// 同步加载模块</span><br><span class="line">var myModule = require(&#x27;./myModule&#x27;);</span><br><span class="line"></span><br><span class="line">// 异步加载模块</span><br><span class="line">require.async(&#x27;./asyncModule&#x27;, function(asyncModule) &#123;</span><br><span class="line">  asyncModule();</span><br><span class="line">&#125;);</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="官方标准"><a href="#官方标准" class="headerlink" title="官方标准"></a><strong>官方标准</strong></h3><h3 id="1-ES6-Modules-ECMAScript-2015-Modules-编译时方案"><a href="#1-ES6-Modules-ECMAScript-2015-Modules-编译时方案" class="headerlink" title="1. ES6 Modules (ECMAScript 2015 Modules) 编译时方案"></a>1. <strong>ES6 Modules (ECMAScript 2015 Modules)</strong> 编译时方案</h3><ul><li>  <strong>简介</strong>：这是 ECMAScript 规范中正式引入的原生模块化方案，已经被所有现代浏览器广泛支持。</li><li><strong>导入导出</strong>：<ul><li>  使用 <code>import</code> 关键字导入模块。</li><li>  使用 <code>export</code> 关键字导出模块成员。</li></ul></li><li>  <strong>特点</strong>：静态分析友好，允许工具链进行优化；支持按需加载（Tree Shaking），有助于减少打包体积。</li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">// 导出模块</span><br><span class="line">export function greet() &#123;</span><br><span class="line">  console.log(&#x27;Hello from ES6 Modules&#x27;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">// 默认导出</span><br><span class="line">export default class Greeter &#123;&#125;</span><br><span class="line"></span><br><span class="line">// 导入模块</span><br><span class="line">import &#123; greet &#125; from &#x27;./greet.js&#x27;;</span><br><span class="line">import Greeter from &#x27;./Greeter.js&#x27;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="２-Harmony-Modules-ES-Harmony"><a href="#２-Harmony-Modules-ES-Harmony" class="headerlink" title="２. Harmony Modules (ES Harmony)"></a>２. <strong>Harmony Modules (ES Harmony)</strong></h3><ul><li>  <strong>简介</strong>：这是 ES6 Modules 的早期名称，在 ES6 正式发布之前，一些浏览器已经开始实验性地实现了这些特性。</li><li>  <strong>现状</strong>：随着 ES6 Modules 成为官方标准，”Harmony Modules” 这个术语已经不再常用。</li></ul><h3 id="当前趋势"><a href="#当前趋势" class="headerlink" title="当前趋势"></a>当前趋势</h3><p>目前，<strong>ES6 Modules（编译时）</strong> 已经成为最主流的 JavaScript 模块化标准，因为它是由 ECMAScript 标准委员会制定的官方规范，得到了广泛的社区支持和技术栈集成。大多数现代前端框架（如 Vue, React, Angular 等）以及构建工具（如 Webpack, Vite, Parcel 等）都内置了对 ES6 Modules 的支持。因此，如果你正在启动一个新的项目，推荐优先考虑使用 ES6 Modules。<strong>CommonJS（运行时）</strong>　也很庞大随着ｎｏｄｅｊｓ的发展而发展，其他几种目前不是很推荐使用了；</p><h2 id="ES6-Modules-和-CommonJS-之间的一些主要区别"><a href="#ES6-Modules-和-CommonJS-之间的一些主要区别" class="headerlink" title="ES6 Modules 和 CommonJS 之间的一些主要区别"></a><strong>ES6 Modules 和 CommonJS 之间的一些主要区别</strong></h2><h3 id="1-加载机制"><a href="#1-加载机制" class="headerlink" title="1. 加载机制"></a>1. <strong>加载机制</strong></h3><ul><li><p><strong>CommonJS</strong>：</p><ul><li>  <strong>同步加载</strong>：CommonJS 模块是同步加载的，这意味着当 <code>require()</code> 被调用时，程序会阻塞并等待模块加载完成。</li><li>  <strong>运行时解析</strong>：依赖关系是在代码执行期间动态解析的，即当你调用 <code>require()</code> 函数时才加载模块。</li></ul></li><li><p><strong>ES6 Modules</strong>：</p><ul><li>  <strong>异步加载</strong>：ES6 Modules 支持静态分析和按需加载（例如通过 <code>&lt;script type=&quot;module&quot;&gt;</code> 标签），因此它们可以异步加载，不会阻塞主线程。</li><li>  <strong>编译时解析</strong>：依赖关系是在编译阶段就确定下来了，这允许工具链进行更深入的优化，如 Tree Shaking（去除未使用的代码）。</li></ul></li></ul><h3 id="2-导入导出语法"><a href="#2-导入导出语法" class="headerlink" title="2. 导入导出语法"></a>2. <strong>导入导出语法</strong></h3><ul><li><strong>CommonJS</strong>：<ul><li>  <strong>导出</strong>：使用 <code>module.exports</code> 或 <code>exports</code> 对象来导出成员。</li><li>  <strong>导入</strong>：使用 <code>require()</code> 函数来导入模块。</li></ul></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">// 导出模块 (CommonJS)</span><br><span class="line">module.exports = function greet() &#123;</span><br><span class="line">  console.log(&#x27;Hello from CommonJS&#x27;);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">// 导入模块 (CommonJS)</span><br><span class="line">const greet = require(&#x27;./greet&#x27;);</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul><li><strong>ES6 Modules</strong>：<ul><li>  <strong>导出</strong>：使用 <code>export</code> 关键字来导出函数、类或变量；也可以使用 <code>export default</code> 来定义默认导出。</li><li>  <strong>导入</strong>：使用 <code>import</code> 关键字来导入模块，支持命名导入、默认导入等。</li></ul></li></ul><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">// 导出模块 (ES6 Modules)</span><br><span class="line">export function greet() &#123;</span><br><span class="line">  console.log(&#x27;Hello from ES6 Modules&#x27;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">export default class Greeter &#123;&#125;</span><br><span class="line"></span><br><span class="line">// 导入模块 (ES6 Modules)</span><br><span class="line">import &#123; greet &#125; from &#x27;./greet.js&#x27;;</span><br><span class="line">import Greeter from &#x27;./Greeter.js&#x27;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="3-单例-vs-多例"><a href="#3-单例-vs-多例" class="headerlink" title="3. 单例 vs 多例"></a>3. <strong>单例 vs 多例</strong></h3><ul><li><p>  <strong>CommonJS</strong>：每次 <code>require()</code> 同一个模块都会返回同一个实例，即模块是单例模式。</p></li><li><p>  <strong>ES6 Modules</strong>：每个模块都是一个新的实例，除非显式地共享状态。这使得模块的行为更加可预测，减少了意外的副作用。</p></li></ul><h3 id="4-互操作性"><a href="#4-互操作性" class="headerlink" title="4. 互操作性"></a>4. <strong>互操作性</strong></h3><ul><li><p>  <strong>CommonJS</strong>：Node.js 原生支持 CommonJS，但可以通过 Babel 或其他转译器将 ES6 Modules 转换为 CommonJS 以在 Node.js 中使用。</p></li><li><p>  <strong>ES6 Modules</strong>：现代浏览器原生支持 ES6 Modules，但在 Node.js 中需要特定的配置（如 <code>.mjs</code> 文件扩展名或启用实验性的 <code>--experimental-modules</code> 标志）。不过，从 Node.js v12 开始，对 ES6 Modules 的支持逐渐增强，到了 Node.js v14 及以上版本，这种支持变得更加稳定和成熟。</p></li></ul><h3 id="5-性能与优化"><a href="#5-性能与优化" class="headerlink" title="5. 性能与优化"></a>5. <strong>性能与优化</strong></h3><ul><li><p>  <strong>ES6 Modules</strong>：由于其静态解析特性，构建工具可以更好地理解模块之间的依赖关系，从而实现更高效的打包和优化策略，如 Tree Shaking。</p></li><li><p>  <strong>CommonJS</strong>：因为依赖关系是在运行时确定的，所以很难在编译阶段进行类似的优化。</p></li></ul><h3 id="小结-1"><a href="#小结-1" class="headerlink" title="小结"></a>小结</h3><p>尽管 CommonJS 在 Node.js 环境中依然非常重要，并且对于服务器端开发来说仍然是一个非常强大的选择，但 ES6 Modules 因其更好的性能、更灵活的语法以及广泛的社区支持，已经成为现代前端开发的首选。如果你正在启动一个新的项目，尤其是在客户端应用中，推荐优先考虑使用 ES6 Modules。然而，在某些情况下，比如处理遗留系统或特定的 Node.js 模块时，你可能仍然需要使用 CommonJS。</p><h2 id="包管理器-Package-Manager-（一系列模块集合）"><a href="#包管理器-Package-Manager-（一系列模块集合）" class="headerlink" title="包管理器 (Package Manager)　（一系列模块集合）"></a><strong>包管理器 (Package Manager)</strong>　（一系列模块集合）</h2><p>包管理器是用于自动化处理软件包（库、框架等）的安装、更新、配置和删除的工具。在 JavaScript 和 Node.js 生态系统中，最常用的包管理器包括 npm、Yarn 和 pnpm。它们简化了依赖管理和项目构建过程，使得开发者可以更专注于编写业务逻辑。</p><h3 id="1-npm-Node-Package-Manager"><a href="#1-npm-Node-Package-Manager" class="headerlink" title="1. npm (Node Package Manager)"></a>1. <strong>npm (Node Package Manager)</strong></h3><ul><li>  <strong>简介</strong>：npm 是 Node.js 的默认包管理器，也是世界上最大的软件注册表之一。它提供了丰富的命令行接口来管理依赖项，并且拥有庞大的社区支持。</li><li><strong>特点</strong>：<ul><li>  安装全局或本地的 npm 包。</li><li>  自动生成 <code>package.json</code> 文件以记录项目的依赖关系。</li><li>  支持脚本命令，允许你定义和运行自定义任务。</li><li>  内置安全审计功能，帮助识别潜在的安全问题。</li></ul></li><li>  <strong>使用示例</strong>：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 初始化一个新的 npm 项目</span></span><br><span class="line">npm init</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装一个依赖包到项目中</span></span><br><span class="line">npm install &lt;package-name&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 更新所有依赖包到最新版本</span></span><br><span class="line">npm update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行自定义脚本</span></span><br><span class="line">npm run &lt;script-name&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul><h3 id="2-Yarn"><a href="#2-Yarn" class="headerlink" title="2. Yarn"></a>2. <strong>Yarn</strong></h3><ul><li>  <strong>简介</strong>：由 Facebook 开发并维护，旨在解决 npm 在速度和安全性方面的一些局限性。Yarn 通过锁文件 (<code>yarn.lock</code>) 来确保不同环境中依赖的一致性。</li><li><strong>特点</strong>：<ul><li>  更快的安装速度，得益于并行化下载和缓存机制。</li><li>  确定性的安装，保证每次安装的结果相同。</li><li>  提供了更好的离线模式支持。</li></ul></li><li>  <strong>使用示例</strong>：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 初始化一个新的 Yarn 项目</span></span><br><span class="line">yarn init</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装一个依赖包到项目中</span></span><br><span class="line">yarn add &lt;package-name&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 更新所有依赖包到最新版本</span></span><br><span class="line">yarn upgrade</span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行自定义脚本</span></span><br><span class="line">yarn run &lt;script-name&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul><h3 id="3-pnpm"><a href="#3-pnpm" class="headerlink" title="3. pnpm"></a>3. <strong>pnpm</strong></h3><ul><li>  <strong>简介</strong>：pnpm 是一种新型的包管理器，它解决了传统 npm 和 Yarn 在磁盘空间利用率上的不足，采用了一种称为“内容可寻址存储”的方法来存储依赖包。</li><li><strong>特点</strong>：<ul><li>  极大地节省磁盘空间，因为相同的依赖只保存一份副本。</li><li>  快速安装速度，同样利用了并行化下载。</li><li>  与 npm 和 Yarn 兼容，可以直接替换现有工作流。</li></ul></li><li>  <strong>使用示例</strong>：</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 初始化一个新的 pnpm 项目</span></span><br><span class="line">pnpm init</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装一个依赖包到项目中</span></span><br><span class="line">pnpm add &lt;package-name&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># 更新所有依赖包到最新版本</span></span><br><span class="line">pnpm update</span><br><span class="line"></span><br><span class="line"><span class="comment"># 运行自定义脚本</span></span><br><span class="line">pnpm run &lt;script-name&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="4-其他包管理器"><a href="#4-其他包管理器" class="headerlink" title="4. 其他包管理器"></a>4. <strong>其他包管理器</strong></h3><p>虽然 npm、Yarn 和 pnpm 是目前最流行的 JavaScript/Node.js 包管理器，但也存在一些其他的选项：</p><ul><li>  <strong>Bower</strong>（已废弃）：曾经是一个流行的前端包管理器，但由于其设计限制（如缺乏对嵌套依赖的支持），已经被社区广泛弃用。</li><li>  <strong>Volta</strong>：专门为 Node.js 应用提供一致的开发环境，能够自动切换 Node.js 版本。</li></ul><h3 id="选择合适的包管理器"><a href="#选择合适的包管理器" class="headerlink" title="选择合适的包管理器"></a>选择合适的包管理器</h3><p>选择哪种包管理器取决于你的具体需求和技术栈偏好。对于大多数新项目来说，npm 和 pnpm 是非常好的选择，因为它们都提供了出色的性能和广泛的社区支持。如果你需要特别关注依赖一致性或更快的安装速度，那么 Yarn 或 pnpm 可能更适合你。此外，随着 pnpm 的快速发展及其独特的内容可寻址存储特性，在大型项目或多团队协作环境中，pnpm 正变得越来越受欢迎。</p><p>无论选择哪一个包管理器，确保遵循最佳实践，例如使用锁文件来固定依赖版本、定期检查和更新依赖以保持安全性和兼容性。</p><p>确实，选择哪种包管理器应该基于项目的具体需求和技术栈偏好。以下是更详细的分析，帮助你更好地理解如何根据这些因素做出选择：</p><h3 id="1-npm-和-pnpm-的出色性能与广泛支持"><a href="#1-npm-和-pnpm-的出色性能与广泛支持" class="headerlink" title="1. npm 和 pnpm 的出色性能与广泛支持"></a>1. <strong>npm 和 pnpm 的出色性能与广泛支持</strong></h3><ul><li><p>  <strong>npm</strong>：作为 Node.js 的默认包管理器，npm 拥有一个庞大的生态系统和活跃的社区。它不仅提供了丰富的命令行接口来管理依赖项，还拥有内置的安全审计功能，帮助识别潜在的安全问题。npm 的 <code>package-lock.json</code> 文件确保了不同环境中依赖的一致性。</p></li><li><p>  <strong>pnpm</strong>：pnpm 是一个快速且节省磁盘空间的包管理工具，它通过内容可寻址存储（CAS）机制来避免重复下载相同的依赖包，从而提高了安装速度并减少了磁盘使用量。对于大型项目或多团队协作环境，pnpm 的优势尤为明显，因为它能够有效减少多项目间的依赖冗余，并且对 monorepos 提供了良好的支持。</p></li></ul><h3 id="2-Yarn-和-pnpm-的依赖一致性及安装速度"><a href="#2-Yarn-和-pnpm-的依赖一致性及安装速度" class="headerlink" title="2. Yarn 和 pnpm 的依赖一致性及安装速度"></a>2. <strong>Yarn 和 pnpm 的依赖一致性及安装速度</strong></h3><ul><li><p>  <strong>Yarn</strong>：Yarn 引入了 <code>yarn.lock</code> 文件，确保了不同环境中依赖的一致性。它的并行化下载机制显著提升了安装速度，尤其是在网络条件较好的情况下。此外，Yarn 支持离线模式，即使没有互联网连接也能安装之前缓存过的依赖包。</p></li><li><p>  <strong>pnpm</strong>：除了上述提到的优点外，pnpm 还以其高效的磁盘空间管理和安装性能著称。它采用了硬链接和符号链接的方式将依赖包安装到每个项目的 <code>node_modules</code> 目录下，这不仅加快了安装过程，也保证了依赖关系的清晰度，避免了嵌套过深的问题。</p></li></ul><h3 id="3-pnpm-在大型项目中的应用"><a href="#3-pnpm-在大型项目中的应用" class="headerlink" title="3. pnpm 在大型项目中的应用"></a>3. <strong>pnpm 在大型项目中的应用</strong></h3><p>随着 pnpm 的快速发展，越来越多的企业级项目开始采用它作为首选的包管理工具。pnpm 的独特之处在于它可以有效地处理复杂的依赖关系，并且在多项目环境下表现出色。例如，在 monorepo 架构中，pnpm 能够很好地管理多个包之间的依赖，同时保持高效的工作流。</p><h3 id="4-最佳实践建议"><a href="#4-最佳实践建议" class="headerlink" title="4. 最佳实践建议"></a>4. <strong>最佳实践建议</strong></h3><p>无论选择了哪一种包管理器，遵循以下最佳实践都是非常重要的：</p><ul><li><p>  <strong>使用锁文件固定依赖版本</strong>：无论是 npm 的 <code>package-lock.json</code> 还是 Yarn 的 <code>yarn.lock</code>，锁文件都能确保每次安装的结果一致，这对于维护项目的稳定性和可重复构建至关重要。</p></li><li><p>  <strong>定期检查和更新依赖</strong>：随着时间推移，新的安全补丁和功能改进会被添加到各个库中。因此，定期运行如 <code>npm audit</code> 或者 <code>yarn upgrade</code> 来查找并修复可能存在的漏洞或兼容性问题是必要的。</p></li><li><p>  <strong>关注安全性</strong>：所有现代包管理器都提供了一定程度的安全保障措施，比如加密哈希验证、安全警告等。确保你的开发流程中包含了这些特性，以保护应用程序免受恶意软件的影响。</p></li></ul><p>综上所述，虽然 npm 和 pnpm 都是非常优秀的选项，但在特定场景下，Yarn 或 pnpm 可能会更适合某些开发者的需求。特别是当涉及到依赖一致性和安装速度时，Yarn 和 pnpm 各有千秋；而对于大型项目或多团队协作环境，则应优先考虑 pnpm 的优势。最终的选择应当结合自身的技术栈以及项目的实际需求来决定。</p><h2 id="使用-pnpm-搭建-monorepo"><a href="#使用-pnpm-搭建-monorepo" class="headerlink" title="使用 pnpm 搭建 monorepo"></a>使用 pnpm 搭建 monorepo</h2><p>使用 pnpm 搭建 monorepo 项目可以极大地简化多项目管理和依赖处理。pnpm 提供了对 monorepos 的原生支持，使得开发者能够在一个单一的代码仓库中管理多个包或应用。以下是详细的步骤指南，帮助你构建一个基于 pnpm 的 monorepo 结构。</p><h3 id="1-安装-pnpm"><a href="#1-安装-pnpm" class="headerlink" title="1. 安装 pnpm"></a>1. 安装 pnpm</h3><p>首先确保你的环境中已经安装了 Node.js 和 npm。然后全局安装 pnpm：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install -g pnpm</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>验证安装是否成功：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm -v</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="2-创建并初始化项目目录"><a href="#2-创建并初始化项目目录" class="headerlink" title="2. 创建并初始化项目目录"></a>2. 创建并初始化项目目录</h3><p>创建一个新的文件夹作为 monorepo 的根目录，并进入该文件夹：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">mkdir my-monorepo</span><br><span class="line">cd my-monorepo</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>初始化项目，生成 <code>package.json</code> 文件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm init</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="3-配置工作空间（Workspace）"><a href="#3-配置工作空间（Workspace）" class="headerlink" title="3. 配置工作空间（Workspace）"></a>3. 配置工作空间（Workspace）</h3><p>在项目的根目录下创建 <code>pnpm-workspace.yaml</code> 文件，用于定义哪些目录下的包属于这个 monorepo：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"># pnpm-workspace.yaml</span><br><span class="line">packages:</span><br><span class="line">  - &#x27;packages/*&#x27;</span><br><span class="line">  - &#x27;apps/*&#x27;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>这里我们假设所有的子包都将存放在 <code>packages/</code> 目录下，而应用程序则放置于 <code>apps/</code> 目录。</p><h3 id="4-添加子项目"><a href="#4-添加子项目" class="headerlink" title="4. 添加子项目"></a>4. 添加子项目</h3><p>根据需要，在 <code>packages/</code> 或 <code>apps/</code> 目录下创建子项目，并为每个子项目初始化 <code>package.json</code> 文件。例如，添加一个名为 <code>utils</code> 的工具库：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p packages/utils</span><br><span class="line">cd packages/utils</span><br><span class="line">pnpm init -y</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>编辑 <code>packages/utils/package.json</code> 来指定其名称、版本和其他相关信息：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;name&quot;: &quot;utils&quot;,</span><br><span class="line">  &quot;version&quot;: &quot;0.0.0&quot;,</span><br><span class="line">  &quot;main&quot;: &quot;./index.ts&quot;,</span><br><span class="line">  &quot;module&quot;: &quot;./index.ts&quot;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>同样地，你可以按照这种方式添加更多的子项目或应用程序。</p><h3 id="5-安装依赖"><a href="#5-安装依赖" class="headerlink" title="5. 安装依赖"></a>5. 安装依赖</h3><p>对于公共依赖项，可以直接在根目录的 <code>package.json</code> 中添加，并使用 <code>-w</code> 参数将它们安装到整个工作区范围内：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm add &lt;dependency-name&gt; -w</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>对于特定于某个子项目的依赖，则可以在相应的子项目目录内执行安装命令，或者通过 <code>--filter</code> 参数指定要影响的包：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm --filter &lt;package-name&gt; add &lt;dependency-name&gt;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="6-跨项目依赖"><a href="#6-跨项目依赖" class="headerlink" title="6. 跨项目依赖"></a>6. 跨项目依赖</h3><p>为了让一个子项目依赖另一个子项目，可以在子项目的 <code>package.json</code> 中添加依赖声明，并使用 <code>workspace:*</code> 来引用其他工作区内的包：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;dependencies&quot;: &#123;</span><br><span class="line">    &quot;utils&quot;: &quot;workspace:*&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>这告诉 pnpm 从当前的工作区中查找最新的 <code>utils</code> 版本。</p><h3 id="7-构建与运行脚本"><a href="#7-构建与运行脚本" class="headerlink" title="7. 构建与运行脚本"></a>7. 构建与运行脚本</h3><p>为了方便管理所有子项目的构建和测试任务，可以在根目录的 <code>package.json</code> 中定义一些脚本命令，利用 <code>pnpm recursive</code> 来批量执行这些命令：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;scripts&quot;: &#123;</span><br><span class="line">    &quot;build&quot;: &quot;pnpm -r run build&quot;,</span><br><span class="line">    &quot;test&quot;: &quot;pnpm -r run test&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>这样就可以一次性对所有相关联的子项目进行构建或测试。</p><h3 id="8-ESLint-Prettier-等工具配置"><a href="#8-ESLint-Prettier-等工具配置" class="headerlink" title="8. ESLint, Prettier 等工具配置"></a>8. ESLint, Prettier 等工具配置</h3><p>为了保证代码风格的一致性，可以在 monorepo 的根目录设置统一的 ESLint 和 Prettier 规则，并将其安装为开发依赖：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm add eslint prettier @typescript-eslint/eslint-plugin @typescript-eslint/parser -D -w</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>接着初始化 ESLint 并配置 <code>.eslintrc.json</code> 文件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npx eslint --init</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>同时也可以为 Prettier 创建配置文件 <code>.prettierrc.json</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;printWidth&quot;: 80,</span><br><span class="line">  &quot;tabWidth&quot;: 2,</span><br><span class="line">  &quot;useTabs&quot;: false,</span><br><span class="line">  &quot;singleQuote&quot;: true,</span><br><span class="line">  &quot;semi&quot;: true,</span><br><span class="line">  &quot;trailingComma&quot;: &quot;all&quot;,</span><br><span class="line">  &quot;bracketSpacing&quot;: true</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="9-Git-Hooks"><a href="#9-Git-Hooks" class="headerlink" title="9. Git Hooks"></a>9. Git Hooks</h3><p>为了确保提交前的质量检查，可以集成 Git Hooks 工具如 Husky 和 Lint-Staged。先安装必要的依赖：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm add husky lint-staged -D -w</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>初始化 Husky：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npx husky install</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>添加预提交钩子以运行 ESLint：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npx husky add .husky/pre-commit &quot;pnpm lint&quot;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>以上步骤完成后，你就拥有了一套完整的基于 pnpm 的 monorepo 开发环境。这种结构不仅有助于组织复杂的前端工程，还能提高团队协作效率，减少重复劳动。</p><h2 id="JS工具链"><a href="#JS工具链" class="headerlink" title="JS工具链"></a>JS工具链</h2><h3 id="兼容性"><a href="#兼容性" class="headerlink" title="兼容性"></a>兼容性</h3><ul><li>  API 兼容 polyfill 代表 <a class="link"   href="https://link.juejin.cn/?target=https://gitee.com/independenter_admin/core-js/%23usage"  title="https://gitee.com/independenter_admin/core-js/#usage">core-js<i class="fas fa-external-link-alt"></i></a></li><li>  语法增强 代表 syntax transformer （runtime 运行时）语法转换器</li></ul><p>下面来着重介绍一下这个 core-js</p><h3 id="core-js功能特点"><a href="#core-js功能特点" class="headerlink" title="core-js功能特点"></a>core-js功能特点</h3><h3 id="core-js支持最新的-ECMAScript-标准"><a href="#core-js支持最新的-ECMAScript-标准" class="headerlink" title="core-js支持最新的 ECMAScript 标准"></a>core-js支持最新的 ECMAScript 标准</h3><p><code>core-js</code> 不仅支持已发布的 ECMAScript 标准，还涵盖了处于不同阶段的提案。这使得开发者可以在他们的项目中试验即将成为标准的新特性，同时保持良好的浏览器兼容性</p><h3 id="core-js模块化设计"><a href="#core-js模块化设计" class="headerlink" title="core-js模块化设计"></a>core-js模块化设计</h3><p><code>core-js</code> 的一大亮点在于其高度模块化的设计，允许开发者只引入他们需要的部分。这种按需加载的方式有助于减少最终打包文件的大小，从而提高应用性能。此外，<code>core-js</code> 可以在不污染全局命名空间的情况下工作，这意味着它可以与其他库或框架很好地共存，而不会引起命名冲突</p><h3 id="core-js与工具链集成"><a href="#core-js与工具链集成" class="headerlink" title="core-js与工具链集成"></a>core-js与工具链集成</h3><p><code>core-js</code> 设计时考虑到了与现代构建工具的良好集成。例如，它与 Babel 高度兼容，可以通过 <code>@babel/preset-env</code> 和 <code>@babel/transform-runtime</code> 插件轻松配置，以便根据目标浏览器列表自动选择合适的 polyfills。对于 Webpack 用户来说，还可以利用 <code>core-js-compat</code> 包来优化 polyfill 的选择，确保只包含必要的代码</p><h3 id="安装与使用"><a href="#安装与使用" class="headerlink" title="安装与使用"></a>安装与使用</h3><p>安装 <code>core-js</code> 非常简单，可以通过 npm 或 yarn 进行安装：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">深色版本</span><br><span class="line">npm install --save core-js</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>或者</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yarn add core-js</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>接下来，你可以选择全局导入所有 polyfills，也可以根据需要单独导入特定的功能。为了更好地控制哪些 polyfills 被包含进来，推荐的做法是在入口文件之前添加如下语句：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">import &#x27;core-js/stable&#x27;; // 引入稳定版的 ES polyfills</span><br><span class="line">// 或者更具体地</span><br><span class="line">import &#x27;core-js/features/array/from&#x27;; // 只引入 Array.from 的 polyfill</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>如果你正在使用 Babel，则可能不需要手动导入 <code>core-js</code>，因为 <code>@babel/preset-env</code> （预设 一堆内置插件）会自动处理这一过程。只需确保你的 <code>.browserslistrc</code> 文件中定义了正确的目标浏览器范围，Babel 就会据此决定需要哪些 polyfills（<code>.browserslistrc</code> 文件的作用是定义前端项目所支持的目标浏览器范围，这对于确保代码在不同浏览器中的兼容性至关重要。它被多个前端工具使用，如 Babel、Autoprefixer 等，以决定如何处理代码转换和样式前缀添加等问题</p><h3 id="为什么需要-browserslistrc？"><a href="#为什么需要-browserslistrc？" class="headerlink" title="为什么需要 .browserslistrc？"></a>为什么需要 .browserslistrc？</h3><p>当开发者编写现代 JavaScript 或 CSS 时，他们可能会用到一些较新的语法特性或 CSS 属性，这些可能并不是所有浏览器都能理解的。例如，某些浏览器可能不支持最新的 JavaScript 语法糖或是特定的 CSS 属性。通过配置 <code>.browserslistrc</code> 文件，开发者可以指定他们的应用程序应该支持哪些浏览器版本，这样像 Babel 这样的工具就能根据这个列表智能地添加必要的 polyfills 或者转译代码，确保最终生成的代码能够在目标浏览器中正确运行</p><p>此外，对于 CSS 来说，不同的浏览器对新特性的支持程度也各不相同。Autoprefixer 可以读取 <code>.browserslistrc</code> 中的信息，并据此自动为 CSS 规则添加所需的浏览器前缀，从而避免了手动管理这些复杂性和潜在错误的可能性</p><h3 id="browserslistrc-基础语法"><a href="#browserslistrc-基础语法" class="headerlink" title="browserslistrc 基础语法"></a>browserslistrc 基础语法</h3><p><code>.browserslistrc</code> 文件中的每一行代表一个查询条件，用来描述你希望支持的浏览器版本。以下是一些常见的例子：</p><ul><li><p>  <code>last 1 version</code>: 包含每个浏览器的最新版本。</p></li><li><p>  <code>&gt; 1%</code>: 全球范围内使用率超过 1% 的浏览器版本。</p></li><li><p>  <code>maintained node versions</code>: 所有由 Node.js 基金会维护的 Node.js 版本。</p></li><li><p>  <code>not dead</code>: 排除那些已经不再更新且全球使用率低于 0.5% 的浏览器版本</p></li></ul><p>值得注意的是，在 2022 年 6 月 21 日之后，Browserslist 已经将 Internet Explorer 标记为已死，因此通常情况下不需要特别为 IE 添加额外的支持规则，除非项目确实有这方面的需求</p><h3 id="browserslistrc-配置方式"><a href="#browserslistrc-配置方式" class="headerlink" title="browserslistrc 配置方式"></a>browserslistrc 配置方式</h3><p>除了创建单独的 <code>.browserslistrc</code> 文件外，还可以直接在 <code>package.json</code> 文件内设置 <code>browserslist</code> 字段来实现同样的效果。两种方法都可以有效地传达给相关工具你的项目打算支持哪些浏览器版本。如果同时存在这两种配置，则优先使用 <code>.browserslistrc</code> 文件中的设置</p><p>另外，为了适应不同的开发环境（如生产环境与开发环境），可以通过设置环境变量 <code>BROWSERSLIST_ENV</code> 或者 <code>NODE_ENV</code> 来指定不同的浏览器查询条件。这允许你在不同环境中应用不同的优化策略，比如在开发阶段专注于最新的浏览器特性，而在生产环境中更广泛地覆盖用户群体）</p><h3 id="语言增强"><a href="#语言增强" class="headerlink" title="语言增强"></a>语言增强</h3><p>‌<strong>前端中的语言增强</strong>‌是指通过改进和扩展现有编程语言的功能和特性，以提升开发效率和代码质量。在前端开发中，语言增强主要体现在以下几个方面：</p><ol><li><p> ‌**<a class="link"   href="https://link.juejin.cn/?target=https://www.baidu.com/s?rsv_dl=re_dqa_generate&sa=re_dqa_generate&wd=ES6&rsv_pq=e576cb1c02987e83&oq=%25E5%2589%258D%25E7%25AB%25AF%25E4%25B8%25AD%25E7%259A%2584%25E8%25AF%25AD%25E8%25A8%2580%25E5%25A2%259E%25E5%25BC%25BA%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&tn=baidu&ie=utf-8"  title="https://www.baidu.com/s?rsv_dl=re_dqa_generate&amp;sa=re_dqa_generate&amp;wd=ES6&amp;rsv_pq=e576cb1c02987e83&amp;oq=%E5%89%8D%E7%AB%AF%E4%B8%AD%E7%9A%84%E8%AF%AD%E8%A8%80%E5%A2%9E%E5%BC%BA%E6%98%AF%E4%BB%80%E4%B9%88&amp;rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&amp;tn=baidu&amp;ie=utf-8">ES6**<i class="fas fa-external-link-alt"></i></a>及更高版本**‌：ES6引入了块级作用域、默认参数、箭头函数、解构赋值、扩展运算符、模板字符串等新特性，使得代码更加简洁、易于维护。此外，ES6还新增了<code>Map</code>、<code>Set</code>、<code>Proxy</code>、<code>Reflect</code>等数据结构和辅助函数，增强了处理对象的能力，使得异步编程更加直观‌1。</p></li><li><p> ‌**<a class="link"   href="https://link.juejin.cn/?target=https://www.baidu.com/s?rsv_dl=re_dqa_generate&sa=re_dqa_generate&wd=TypeScript&rsv_pq=e576cb1c02987e83&oq=%25E5%2589%258D%25E7%25AB%25AF%25E4%25B8%25AD%25E7%259A%2584%25E8%25AF%25AD%25E8%25A8%2580%25E5%25A2%259E%25E5%25BC%25BA%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&tn=baidu&ie=utf-8"  title="https://www.baidu.com/s?rsv_dl=re_dqa_generate&amp;sa=re_dqa_generate&amp;wd=TypeScript&amp;rsv_pq=e576cb1c02987e83&amp;oq=%E5%89%8D%E7%AB%AF%E4%B8%AD%E7%9A%84%E8%AF%AD%E8%A8%80%E5%A2%9E%E5%BC%BA%E6%98%AF%E4%BB%80%E4%B9%88&amp;rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&amp;tn=baidu&amp;ie=utf-8">TypeScript**<i class="fas fa-external-link-alt"></i></a>**‌：TypeScript是JavaScript的一个超集，添加了静态类型检查等特性。通过类型注解，TypeScript提供了更强的类型检查，帮助开发者在编码阶段发现潜在的类型错误，提高代码质量和开发效率‌2。</p></li><li><p> ‌**<a class="link"   href="https://link.juejin.cn/?target=https://www.baidu.com/s?rsv_dl=re_dqa_generate&sa=re_dqa_generate&wd=Babel&rsv_pq=e576cb1c02987e83&oq=%25E5%2589%258D%25E7%25AB%25AF%25E4%25B8%25AD%25E7%259A%2584%25E8%25AF%25AD%25E8%25A8%2580%25E5%25A2%259E%25E5%25BC%25BA%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&tn=baidu&ie=utf-8"  title="https://www.baidu.com/s?rsv_dl=re_dqa_generate&amp;sa=re_dqa_generate&amp;wd=Babel&amp;rsv_pq=e576cb1c02987e83&amp;oq=%E5%89%8D%E7%AB%AF%E4%B8%AD%E7%9A%84%E8%AF%AD%E8%A8%80%E5%A2%9E%E5%BC%BA%E6%98%AF%E4%BB%80%E4%B9%88&amp;rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&amp;tn=baidu&amp;ie=utf-8">Babel**<i class="fas fa-external-link-alt"></i></a>**‌：Babel是一个广泛使用的转译器，可以将ES6及更高版本的代码转译为向后兼容的JavaScript代码，使得开发者可以使用最新的JavaScript特性，同时保证老版本的浏览器也能正常运行代码‌1。</p></li><li><p> ‌**<a class="link"   href="https://link.juejin.cn/?target=https://www.baidu.com/s?rsv_dl=re_dqa_generate&sa=re_dqa_generate&wd=Webpack&rsv_pq=e576cb1c02987e83&oq=%25E5%2589%258D%25E7%25AB%25AF%25E4%25B8%25AD%25E7%259A%2584%25E8%25AF%25AD%25E8%25A8%2580%25E5%25A2%259E%25E5%25BC%25BA%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&tn=baidu&ie=utf-8"  title="https://www.baidu.com/s?rsv_dl=re_dqa_generate&amp;sa=re_dqa_generate&amp;wd=Webpack&amp;rsv_pq=e576cb1c02987e83&amp;oq=%E5%89%8D%E7%AB%AF%E4%B8%AD%E7%9A%84%E8%AF%AD%E8%A8%80%E5%A2%9E%E5%BC%BA%E6%98%AF%E4%BB%80%E4%B9%88&amp;rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&amp;tn=baidu&amp;ie=utf-8">Webpack**<i class="fas fa-external-link-alt"></i></a>和<a class="link"   href="https://link.juejin.cn/?target=https://www.baidu.com/s?rsv_dl=re_dqa_generate&sa=re_dqa_generate&wd=Rollup&rsv_pq=e576cb1c02987e83&oq=%25E5%2589%258D%25E7%25AB%25AF%25E4%25B8%25AD%25E7%259A%2584%25E8%25AF%25AD%25E8%25A8%2580%25E5%25A2%259E%25E5%25BC%25BA%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&tn=baidu&ie=utf-8"  title="https://www.baidu.com/s?rsv_dl=re_dqa_generate&amp;sa=re_dqa_generate&amp;wd=Rollup&amp;rsv_pq=e576cb1c02987e83&amp;oq=%E5%89%8D%E7%AB%AF%E4%B8%AD%E7%9A%84%E8%AF%AD%E8%A8%80%E5%A2%9E%E5%BC%BA%E6%98%AF%E4%BB%80%E4%B9%88&amp;rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&amp;tn=baidu&amp;ie=utf-8">Rollup**<i class="fas fa-external-link-alt"></i></a>**‌：这些模块打包工具支持ES6模块化开发，帮助开发者更好地组织和管理项目，提高开发效率和代码复用性‌1。</p></li><li><p> ‌**<a class="link"   href="https://link.juejin.cn/?target=https://www.baidu.com/s?rsv_dl=re_dqa_generate&sa=re_dqa_generate&wd=CSS%2520Modules&rsv_pq=e576cb1c02987e83&oq=%25E5%2589%258D%25E7%25AB%25AF%25E4%25B8%25AD%25E7%259A%2584%25E8%25AF%25AD%25E8%25A8%2580%25E5%25A2%259E%25E5%25BC%25BA%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&tn=baidu&ie=utf-8"  title="https://www.baidu.com/s?rsv_dl=re_dqa_generate&amp;sa=re_dqa_generate&amp;wd=CSS%20Modules&amp;rsv_pq=e576cb1c02987e83&amp;oq=%E5%89%8D%E7%AB%AF%E4%B8%AD%E7%9A%84%E8%AF%AD%E8%A8%80%E5%A2%9E%E5%BC%BA%E6%98%AF%E4%BB%80%E4%B9%88&amp;rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&amp;tn=baidu&amp;ie=utf-8">CSS Modules**<i class="fas fa-external-link-alt"></i></a>和<a class="link"   href="https://link.juejin.cn/?target=https://www.baidu.com/s?rsv_dl=re_dqa_generate&sa=re_dqa_generate&wd=Scoped%2520CSS&rsv_pq=e576cb1c02987e83&oq=%25E5%2589%258D%25E7%25AB%25AF%25E4%25B8%25AD%25E7%259A%2584%25E8%25AF%25AD%25E8%25A8%2580%25E5%25A2%259E%25E5%25BC%25BA%25E6%2598%25AF%25E4%25BB%2580%25E4%25B9%2588&rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&tn=baidu&ie=utf-8"  title="https://www.baidu.com/s?rsv_dl=re_dqa_generate&amp;sa=re_dqa_generate&amp;wd=Scoped%20CSS&amp;rsv_pq=e576cb1c02987e83&amp;oq=%E5%89%8D%E7%AB%AF%E4%B8%AD%E7%9A%84%E8%AF%AD%E8%A8%80%E5%A2%9E%E5%BC%BA%E6%98%AF%E4%BB%80%E4%B9%88&amp;rsv_t=3e24QtyaKdHsvG/ccL+YoNpB0XIQLo6QnBzOYlc3h7vYC3UBixuJktVQ6/g&amp;tn=baidu&amp;ie=utf-8">Scoped CSS**<i class="fas fa-external-link-alt"></i></a>**‌：这些技术通过封装CSS，避免全局污染，使得组件化开发成为可能，提高了代码的可维护性和复用性‌3。</p></li><li><p> <strong>CSS 预处理器与 PostCSS</strong> 虽然 HTML 和 CSS 并不是传统意义上的编程语言，但它们同样经历了显著的增强。CSS 预处理器如 SASS/SCSS、LESS 和 Stylus 引入了变量、混合宏、嵌套规则等功能，极大地简化了复杂样式表的设计过程。而 PostCSS 则是一个强大的插件平台，它可以进一步扩展 CSS 的能力，例如自动添加供应商前缀、优化输出大小等。这些工具共同作用，使得 CSS 更加富有表现力且易于管理，同时也提高了开发效率和维护性。</p></li><li><p> <strong>WebAssembly (Wasm)</strong> WebAssembly 是一种新兴的二进制格式，允许 C、C++、Rust 等编译型语言编写的高性能代码直接在浏览器中执行。它为前端带来了前所未有的计算能力和速度优势，尤其是在处理图像处理、音频视频编码解码、游戏渲染等需要大量计算资源的任务时表现出色，随着 WebAssembly 生态系统的不断完善，越来越多的开发者开始探索将其应用于日常工作中，以提升应用性能并拓宽可用技术栈的选择范围。</p></li><li><p> <strong>渐进增强与响应式设计</strong> 渐进增强是一种开发策略，它强调以分层的方式构建网页，确保即使是最基础的内容和服务也能被所有用户访问到，无论他们使用何种设备或网络条件。这一理念鼓励开发者首先创建一个简单但功能完整的版本，然后再逐渐添加更多高级特性，如 JavaScript 动画、AJAX 请求等。与此相关联的是响应式设计，它确保网站能够在不同尺寸的屏幕上良好显示，从而提供一致且优质的用户体验</p></li></ol><p>通过这些语言增强技术，前端开发变得更加高效和可靠，同时也推动了前端工程化的发展。</p><h3 id="前端中的语法增强"><a href="#前端中的语法增强" class="headerlink" title="前端中的语法增强"></a>前端中的语法增强</h3><p>‌<strong>前端中的语法增强</strong>‌主要指的是在JavaScript中使用ES6（ECMAScript 2015）及更高版本中引入的新特性，这些特性能够简化代码编写，提高开发效率和代码的可读性</p><h3 id="什么是-Babel"><a href="#什么是-Babel" class="headerlink" title="什么是 Babel"></a>什么是 Babel</h3><p><a class="link"   href="https://link.juejin.cn/?target=https://www.babeljs.cn/docs/"  title="https://www.babeljs.cn/docs/">Babel<i class="fas fa-external-link-alt"></i></a> 是一个工具链，主要用于将采用 ECMAScript 2015+ 语法编写的代码转换为向后兼容的 JavaScript 语法，以便能够运行在当前和旧版本的浏览器或其他环境中</p><h3 id="如何使用-Babel"><a href="#如何使用-Babel" class="headerlink" title="如何使用 Babel"></a>如何使用 Babel</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm add --save-dev @babel/core @babel/cli @babel/preset-env</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><code>babel.config.json / babel.config.js</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;presets&quot;: [</span><br><span class="line">    [</span><br><span class="line">      &quot;@babel/preset-env&quot;,</span><br><span class="line">      // 浏览器版本</span><br><span class="line">      &#123;</span><br><span class="line">        &quot;targets&quot;: &#123;</span><br><span class="line">          &quot;edge&quot;: &quot;17&quot;,</span><br><span class="line">          &quot;firefox&quot;: &quot;60&quot;,</span><br><span class="line">          &quot;chrome&quot;: &quot;67&quot;,</span><br><span class="line">          &quot;safari&quot;: &quot;11.1&quot;</span><br><span class="line">        &#125;,</span><br><span class="line">        // 按需使用</span><br><span class="line">        &quot;useBuiltIns&quot;: &quot;usage&quot;,</span><br><span class="line">        // corejs版本</span><br><span class="line">        &quot;corejs&quot;: &quot;3.6.5&quot;</span><br><span class="line">      &#125;</span><br><span class="line">    ]</span><br><span class="line">  ]</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="Babel-工作流程-在线AST"><a href="#Babel-工作流程-在线AST" class="headerlink" title="Babel 工作流程 在线AST"></a>Babel 工作流程 <a class="link"   href="https://link.juejin.cn/?target=https://astexplorer.net/"  title="https://astexplorer.net/">在线AST<i class="fas fa-external-link-alt"></i></a></h3><p><img                       lazyload                     alt="image"                     data-src="https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/76e123f464fa4399986665b5deb2b1ad~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg6bG85qix5YmN56uv:q75.awebp?rk3s=f64ab15b&x-expires=1734834075&x-signature=ZRGOHQt9U/agQ78yWOkx5IM5YtU="                      alt="image.png"                ></p><h3 id="解析（Parsing）"><a href="#解析（Parsing）" class="headerlink" title="解析（Parsing）"></a>解析（Parsing）</h3><p>在编译的第一阶段，Babel 使用 <code>@babel/parser</code> 将源代码解析成抽象语法树（AST）。这个过程分为两个子步骤：词法分析和语法分析。词法分析会将原始代码拆分成一个个的 token（最小独立语法单元），而语法分析则负责将 tokens 数组递归处理，构建出 AST</p><p>例如，当我们将一段包含箭头函数的代码 <code>[1, 2, 3].map((n) =&gt; n + 1);</code> 输入给 Babel 时，它首先会被解析成相应的 AST 结构。这一阶段是所有后续操作的基础，因为 AST 提供了一种结构化的表示方法，使得我们可以对代码进行各种变换而不直接操作字符串。</p><h3 id="转换（Transforming）"><a href="#转换（Transforming）" class="headerlink" title="转换（Transforming）"></a>转换（Transforming）</h3><p>一旦生成了 AST，接下来就是对其进行遍历和修改。这一步骤由 <code>@babel/traverse</code> 完成，它可以提供深度遍历 AST 节点的能力，并允许通过插件来实现具体的转换逻辑。插件可以定义 visitor 函数，在进入或离开特定类型的节点时执行自定义的操作，比如添加、删除或替换节点</p><p>继续上面的例子，如果我们要将箭头函数转换为传统函数表达式，则会在转换阶段应用相应的插件，如 <code>@babel/plugin-transform-arrow-functions</code>。此插件会在遇到箭头函数节点时，用等价的传统函数表达式替换之，从而生成一个新的 AST。</p><h3 id="生成（Generating）"><a href="#生成（Generating）" class="headerlink" title="生成（Generating）"></a>生成（Generating）</h3><p>最后，经过转换后的 AST 需要被重新序列化为 JavaScript 代码。这是由 <code>@babel/generator</code> 负责完成的任务，它会遍历新的 AST 并打印出目标代码字符串，同时还可以生成 source map 文件，以便于调试</p><p>对于之前的例子而言，最终输出的代码将是 <code>[1, 2, 3].map(function(n) &#123; return n + 1; &#125;);</code>。此外，Babel 还支持通过 <code>@babel/code-frame</code> 在遇到错误时打印出详细的代码位置信息，帮助开发者快速定位问题所在。</p><h3 id="插件与-Preset"><a href="#插件与-Preset" class="headerlink" title="插件与 Preset"></a>插件与 Preset</h3><p>值得注意的是，<strong>Babel 本身并不会对代码做任何转换；所有的转换都是通过插件来实现的</strong>。插件通常针对某一类语法特性，如箭头函数、类属性等。为了简化配置，Babel 引入了 preset 的概念，它是多个相关插件的集合，旨在一次性解决一组相关的转换需求。例如，<code>@babel/preset-env</code> 可以根据指定的目标环境自动选择所需的转换规则，减少了手动配置的工作量</p><h3 id="babel-如何使用插件和预设"><a href="#babel-如何使用插件和预设" class="headerlink" title="babel 如何使用插件和预设"></a>babel 如何使用插件和预设</h3><p>Babel 的插件和预设是其功能的核心，它们使得开发者可以灵活地定制编译过程，以满足特定项目的需求。下面将详细介绍如何使用 Babel 的插件和预设，并解释两者之间的关系及配置方法。</p><h3 id="babel使用插件"><a href="#babel使用插件" class="headerlink" title="babel使用插件"></a>babel使用插件</h3><p>插件是 Babel 的基本构建块，每个插件负责处理一种或多种特定的 JavaScript 语法特性转换。例如，<code>@babel/plugin-transform-arrow-functions</code> 专门用于将 ES6 箭头函数转换为 ES5 兼容的形式。要使用某个插件，你需要先通过 npm 或 yarn 安装它，然后在 Babel 的配置文件中声明该插件。</p><h4 id="安装插件"><a href="#安装插件" class="headerlink" title="安装插件"></a>安装插件</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install --save-dev @babel/plugin-transform-arrow-functions</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="配置插件"><a href="#配置插件" class="headerlink" title="配置插件"></a>配置插件</h4><p>你可以选择 <code>.babelrc</code>、<code>.babelrc.js</code>、<code>babel.config.js</code> 或者 <code>package.json</code> 中的一个来作为你的 Babel 配置文件。推荐使用带有 <code>.js</code> 扩展名的文件，因为这样可以在配置文件中编写逻辑代码，从而实现更复杂的配置控制。以下是一个简单的 <code>babel.config.js</code> 示例：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">module.exports = &#123;</span><br><span class="line">  plugins: [</span><br><span class="line">    &#x27;@babel/plugin-transform-arrow-functions&#x27;</span><br><span class="line">  ]</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="babel使用预设"><a href="#babel使用预设" class="headerlink" title="babel使用预设"></a>babel使用预设</h3><p>预设是一组预先定义好的插件集合，旨在简化配置流程。比如，<code>@babel/preset-env</code> 是一个非常流行的预设，它可以自动检测目标环境并加载必要的转换插件，而无需手动指定每一个单独的插件。这意味着你只需要安装这一个预设，就能支持大多数现代 JavaScript 特性到旧版浏览器的兼容性转换。</p><h4 id="安装预设"><a href="#安装预设" class="headerlink" title="安装预设"></a>安装预设</h4><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install --save-dev @babel/preset-env</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="配置预设"><a href="#配置预设" class="headerlink" title="配置预设"></a>配置预设</h4><p>同样地，在配置文件中添加预设也是非常直接的事情：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">module.exports = &#123;</span><br><span class="line">  presets: [</span><br><span class="line">    &#x27;@babel/preset-env&#x27;</span><br><span class="line">  ]</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="插件与预设的关系"><a href="#插件与预设的关系" class="headerlink" title="插件与预设的关系"></a>插件与预设的关系</h3><p>当同时配置了插件和预设时，Babel 会按照如下顺序执行：<strong>先运行插件列表中的所有插件，然后再依次执行预设中的插件</strong>。因此，<strong>如果你在配置文件中同时指定了插件和预设，那么插件中的转换规则将会优先于预设中的规则被应用</strong>。此外，值得注意的是，即使某些插件已经在预设中包含，如果在插件列表中再次声明这些插件，则会覆盖预设中的设置。</p><h3 id="参数配置"><a href="#参数配置" class="headerlink" title="参数配置"></a>参数配置</h3><p>对于需要额外参数的插件或预设，可以通过传递对象形式的第二个参数来进行个性化配置。例如，<code>@babel/preset-env</code> 可以接受诸如 <code>targets</code>（定义支持的目标环境）、<code>useBuiltIns</code>（是否引入 polyfill）等选项。下面是如何配置 <code>@babel/preset-env</code> 的例子：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">module.exports = &#123;</span><br><span class="line">  presets: [</span><br><span class="line">    [&#x27;@babel/preset-env&#x27;, &#123;</span><br><span class="line">      targets: &quot;&gt; 0.25%, not dead&quot;,</span><br><span class="line">      useBuiltIns: &quot;usage&quot;,</span><br><span class="line">      corejs: 3</span><br><span class="line">    &#125;]</span><br><span class="line">  ]</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在这个例子中，我们设置了 <code>targets</code> 来指示 Babel 根据 <a class="link"   href="https://link.juejin.cn/?target=https://caniuse.com/"  title="https://caniuse.com/">Can I Use<i class="fas fa-external-link-alt"></i></a> 数据确定哪些浏览器版本应该被支持；同时启用了按需加载 polyfills 的功能，并指定了使用的 <code>core-js</code> 版本为 3 。</p><h3 id="Babel-的-API"><a href="#Babel-的-API" class="headerlink" title="Babel 的 API"></a>Babel 的 API</h3><p>Babel 提供了一系列的 API，使得开发者可以在不同的场景下灵活地集成和使用 Babel 的功能。这些 API 主要集中在几个关键包中：<code>@babel/core</code>、<code>@babel/parser</code>、<code>@babel/traverse</code>、<code>@babel/generator</code> 和 <code>@babel/types</code> 等。下面将详细介绍这些核心 API 及其用途。</p><h3 id="babel-core"><a href="#babel-core" class="headerlink" title="@babel/core"></a>@babel/core</h3><p><code>@babel/core</code> 是 Babel 的核心模块，它封装了整个编译流程，并提供了简单的接口来执行代码转换。这个包最常用的 API 包括：</p><ul><li>  <strong>transformSync(code, options)</strong>: 同步地从源代码开始处理，最终生成目标代码和 sourceMap。</li><li>  <strong>transformAsync(code, options)</strong>: 异步版本的 <code>transformSync</code>，返回一个 Promise。</li><li>  <strong>transformFileSync(filename, options)</strong>: 从文件读取源代码并同步地进行转换。</li><li>  <strong>transformFromAstSync(ast, code, options)</strong>: 接受已经解析好的 AST 和原始代码作为输入，然后生成目标代码和 sourceMap。</li><li>  <strong>transformFromAstAsync(ast, code, options)</strong>: 异步版本的 <code>transformFromAstSync</code> 。</li></ul><p>这些 API 的 <code>options</code> 参数主要用于配置插件和预设，以指定具体的转换规则。此外，还可以通过选项配置输出格式、source maps 以及其他高级设置。</p><h3 id="babel-parser"><a href="#babel-parser" class="headerlink" title="@babel/parser"></a>@babel/parser</h3><p><code>@babel/parser</code>（之前称为 babylon）用于将 JavaScript 源代码解析为抽象语法树（AST）。默认情况下，它可以解析标准的 JavaScript 语法，但也可以通过插件扩展以支持 JSX、TypeScript 等非标准语法。例如：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">const parser = require(&#x27;@babel/parser&#x27;);</span><br><span class="line">const ast = parser.parse(&#x27;const x = () =&gt; 42;&#x27;, &#123;</span><br><span class="line">  sourceType: &#x27;module&#x27;,</span><br><span class="line">  plugins: [&#x27;jsx&#x27;, &#x27;typescript&#x27;]</span><br><span class="line">&#125;);</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="babel-traverse"><a href="#babel-traverse" class="headerlink" title="@babel/traverse"></a>@babel/traverse</h3><p><code>@babel/traverse</code> 提供了一个强大的工具集，可以遍历 AST 并在遍历过程中对特定节点进行操作。它允许你定义 visitor 函数，在进入或离开某个节点时触发特定的行为。每个 visitor 函数接收两个参数：path 和 state。Path 对象包含了关于当前节点的信息以及一系列用于修改 AST 的方法；而 State 则是在遍历期间传递数据的一种方式。</p><h3 id="babel-generator"><a href="#babel-generator" class="headerlink" title="@babel/generator"></a>@babel/generator</h3><p><code>@babel/generator</code> 负责将 AST 转换回 JavaScript 代码字符串，并且可以选择性地生成 source map 文件。该过程与解析相反，旨在确保转换后的代码能够正确反映 AST 的结构变化。</p><h3 id="babel-types"><a href="#babel-types" class="headerlink" title="@babel/types"></a>@babel/types</h3><p><code>@babel/types</code> 提供了一组实用函数，用于创建、检查和验证 AST 节点。这对于编写复杂的 Babel 插件尤其有用，因为它可以帮助开发者更方便地构建和操作 AST 。</p><h3 id="示例：自定义-Babel-插件"><a href="#示例：自定义-Babel-插件" class="headerlink" title="示例：自定义 Babel 插件"></a>示例：自定义 Babel 插件</h3><p>结合上述 API，我们可以创建一个简单的 Babel 插件，比如将所有箭头函数转换为普通函数表达式。首先，我们需要安装必要的依赖项：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install --save-dev @babel/core @babel/parser @babel/traverse @babel/generator @babel/types</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>然后编写插件代码：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">module.exports = function (&#123; types: t &#125;) &#123;</span><br><span class="line">  return &#123;</span><br><span class="line">    visitor: &#123;</span><br><span class="line">      ArrowFunctionExpression(path) &#123;</span><br><span class="line">        const &#123; node &#125; = path;</span><br><span class="line">        // 创建一个新的函数表达式节点</span><br><span class="line">        const newFunction = t.functionExpression(</span><br><span class="line">          null,</span><br><span class="line">          node.params,</span><br><span class="line">          node.body,</span><br><span class="line">          node.async,</span><br><span class="line">          true</span><br><span class="line">        );</span><br><span class="line">        // 替换旧的箭头函数</span><br><span class="line">        path.replaceWith(newFunction);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="自定义babel插件"><a href="#自定义babel插件" class="headerlink" title="自定义babel插件"></a>自定义babel插件</h3><p>创建 Babel 自定义插件是一个强大且灵活的过程，它允许开发者根据自身需求对 JavaScript 代码进行特定的转换。Babel 插件的核心在于操作抽象语法树（AST），通过解析、转换和生成三个步骤来修改代码。下面将详细介绍如何开发一个 Babel 自定义插件，并提供一些实用的例子。</p><h4 id="创建自定义插件的基本结构"><a href="#创建自定义插件的基本结构" class="headerlink" title="创建自定义插件的基本结构"></a>创建自定义插件的基本结构</h4><p>一个典型的 Babel 插件遵循以下格式：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">module.exports = function (babel) &#123;</span><br><span class="line">  const t = babel.types;</span><br><span class="line">  return &#123;</span><br><span class="line">    name: &#x27;my-custom-plugin&#x27;, // 插件名称</span><br><span class="line">    visitor: &#123;</span><br><span class="line">      // 定义访问者模式下的节点处理逻辑</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>在这个基本结构中，<code>babel</code> 对象包含了所有 Babel 提供的方法和工具，而 <code>visitor</code> 属性则用于定义当遍历 AST 时遇到特定类型的节点时要执行的操作。</p><h3 id="使用-Visitor-模式"><a href="#使用-Visitor-模式" class="headerlink" title="使用 Visitor 模式"></a>使用 Visitor 模式</h3><p>在 Babel 中，遍历 AST 的方式是基于访问者模式的。这意味着你可以为不同的 AST 节点类型定义特定的行为。例如，如果你想改变所有的标识符（Identifier）从 <code>n</code> 变成 <code>x</code>，可以这样做：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">visitor: &#123;</span><br><span class="line">  Identifier(path) &#123;</span><br><span class="line">    if (path.node.name === &#x27;n&#x27;) &#123;</span><br><span class="line">      path.node.name = &#x27;x&#x27;;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>这段代码会检查每一个标识符节点的名字是否为 <code>n</code>，如果是，则将其改为 <code>x</code>。</p><h4 id="示例：向-console-log-添加调用位置信息"><a href="#示例：向-console-log-添加调用位置信息" class="headerlink" title="示例：向 console.log 添加调用位置信息"></a>示例：向 console.log 添加调用位置信息</h4><p>假设我们想要创建一个插件，它可以在每次调用 <code>console.log</code> 时自动添加当前调用的位置信息。这可以通过监听 <code>CallExpression</code> 类型的节点并检查其是否为 <code>console.log</code> 来实现：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">module.exports = function (babel) &#123;</span><br><span class="line">  const t = babel.types;</span><br><span class="line">  return &#123;</span><br><span class="line">    name: &#x27;custom-babel-plugin-demo&#x27;,</span><br><span class="line">    visitor: &#123;</span><br><span class="line">      CallExpression(path) &#123;</span><br><span class="line">        const obj = path.node.callee.object;</span><br><span class="line">        const prop = path.node.callee.property;</span><br><span class="line"></span><br><span class="line">        if (</span><br><span class="line">          t.isIdentifier(obj) &amp;&amp;</span><br><span class="line">          t.isIdentifier(prop) &amp;&amp;</span><br><span class="line">          obj.name === &#x27;console&#x27; &amp;&amp;</span><br><span class="line">          prop.name === &#x27;log&#x27;</span><br><span class="line">        ) &#123;</span><br><span class="line">          const location = `---trace: line $&#123;path.node.loc.start.line&#125;, column $&#123;path.node.loc.start.column&#125;---`;</span><br><span class="line">          path.node.arguments.push(t.stringLiteral(location));</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>此插件会在每个 <code>console.log</code> 的参数列表末尾添加一行文本，指示该日志语句所在的行号和列号。</p><h4 id="测试你的插件"><a href="#测试你的插件" class="headerlink" title="测试你的插件"></a>测试你的插件</h4><p>为了确保插件按预期工作，建议编写测试用例。可以使用 <code>@babel/core</code> 的 <code>transformSync</code> 方法来编译一段测试代码，并验证输出是否符合预期。此外，还可以利用 <code>babel-plugin-tester</code> 库简化测试流程。</p><h4 id="发布你的插件"><a href="#发布你的插件" class="headerlink" title="发布你的插件"></a>发布你的插件</h4><p>一旦你完成了插件的开发并且经过充分测试后，就可以考虑将其打包并发布到 npm 上了。首先需要创建一个 <code>package.json</code> 文件描述你的插件元数据，然后通过 <code>npm publish</code> 命令发布。</p><p>总之，<a class="link"   href="https://link.juejin.cn/?target=https://github.com/jamiebuilds/babel-handbook"  title="https://github.com/jamiebuilds/babel-handbook">Babel 自定义插件<i class="fas fa-external-link-alt"></i></a>的开发不仅限于上述例子；实际上，任何你能想到的代码转换都可以通过这种方式来实现。掌握这些基础知识后，你可以开始探索更多复杂的场景，比如优化性能、清理不必要的代码或是集成其他工具和服务。</p><h3 id="小结-2"><a href="#小结-2" class="headerlink" title="小结"></a>小结</h3><p>综上所述，Babel 的核心在于它能够将现代 JavaScript 代码解析为 AST，然后通过一系列插件对该 AST 进行转换，最后再生成符合目标环境要求的新代码。</p><h2 id="CSS工具链"><a href="#CSS工具链" class="headerlink" title="CSS工具链"></a>CSS工具链</h2><p><img                       lazyload                     alt="image"                     data-src="https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/fc6cfd66d0764b7fa5b81885cfb1312e~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg6bG85qix5YmN56uv:q75.awebp?rk3s=f64ab15b&x-expires=1734834075&x-signature=lHOlonnVU1WrkPF5rJ7WHqTy2P8="                      alt="image.png"                > <img                       lazyload                     alt="image"                     data-src="https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/ac3ee4da67ef4e35b0e4cbef7675e511~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg6bG85qix5YmN56uv:q75.awebp?rk3s=f64ab15b&x-expires=1734834075&x-signature=Wf1FQOqFA1mK/4CWH3OO9v4pMZE="                      alt="image.png"                > <img                       lazyload                     alt="image"                     data-src="https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/17bbb2352a5e4c2b92be2a8646a599fd~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg6bG85qix5YmN56uv:q75.awebp?rk3s=f64ab15b&x-expires=1734834075&x-signature=p+3+q6taC65kpi3DdKM/Hq8Zx5E="                      alt="image.png"                ></p><p>在Web开发中，CSS代码压缩和剪枝是优化网站性能的重要步骤。通过移除不必要的字符、注释以及未使用的样式规则，可以显著减少CSS文件的大小，从而加快页面加载速度。以下是几种常用的插件和技术，用于实现CSS代码的压缩和剪枝。</p><h3 id="CSS代码压缩"><a href="#CSS代码压缩" class="headerlink" title="CSS代码压缩"></a>CSS代码压缩</h3><h4 id="CssNano"><a href="#CssNano" class="headerlink" title="CssNano"></a><a class="link"   href="https://link.juejin.cn/?target=https://www.cssnano.cn/docs/introduction/"  title="https://www.cssnano.cn/docs/introduction/">CssNano<i class="fas fa-external-link-alt"></i></a></h4><p><code>CssNano</code> 是一个基于PostCSS的CSS优化工具，它能够在保持CSS代码语义不变的情况下，执行一系列优化操作，如删除多余的空白符及注释、简化选择器等，以确保最终生成的CSS文件尽可能小。此外，<code>CssNano</code> 还支持多种配置选项，允许开发者根据项目需求调整优化级别。</p><h4 id="Optimize-css-assets-webpack-plugin"><a href="#Optimize-css-assets-webpack-plugin" class="headerlink" title="Optimize-css-assets-webpack-plugin"></a><a class="link"   href="https://link.juejin.cn/?target=https://github.com/NMFR/optimize-css-assets-webpack-plugin"  title="https://github.com/NMFR/optimize-css-assets-webpack-plugin">Optimize-css-assets-webpack-plugin<i class="fas fa-external-link-alt"></i></a></h4><p>对于使用Webpack构建系统的项目而言，<code>optimize-css-assets-webpack-plugin</code> 插件是一个不错的选择。该插件可以在生产模式下自动压缩CSS文件，并且兼容其他类型的资源优化插件。安装后，只需将其添加到Webpack配置中的<code>optimization.minimizer</code>数组即可启用压缩功能。</p><h4 id="CssMinimizerWebpackPlugin"><a href="#CssMinimizerWebpackPlugin" class="headerlink" title="CssMinimizerWebpackPlugin"></a><a class="link"   href="https://link.juejin.cn/?target=https://webpack.js.org/plugins/css-minimizer-webpack-plugin/"  title="https://webpack.js.org/plugins/css-minimizer-webpack-plugin/">CssMinimizerWebpackPlugin<i class="fas fa-external-link-alt"></i></a></h4><p>随着Webpack 5的到来，推荐使用<code>css-minimizer-webpack-plugin</code>来替代旧版本中的<code>optimize-css-assets-webpack-plugin</code><strong>进行CSS压缩</strong>。此插件同样依赖于<code>cssnano</code>作为其内部引擎之一，提供了更好的性能和更丰富的特性集。</p><h3 id="CSS代码剪枝"><a href="#CSS代码剪枝" class="headerlink" title="CSS代码剪枝"></a>CSS代码剪枝</h3><h4 id="PurifyCSS"><a href="#PurifyCSS" class="headerlink" title="PurifyCSS"></a><a class="link"   href="https://link.juejin.cn/?target=https://www.purgecss.cn/comparison/"  title="https://www.purgecss.cn/comparison/">PurifyCSS<i class="fas fa-external-link-alt"></i></a></h4><p><code>PurifyCSS</code> 是一款专门用来清除未使用CSS代码的工具。它可以分析HTML文档并与之关联的CSS文件对比，识别出哪些样式规则实际上并未被应用，进而将这些冗余部分从最终输出中剔除。这种方式不仅有助于减小文件体积，还能改善浏览器渲染效率。</p><h4 id="UnCSS-github-amp-UnCSS在线效果"><a href="#UnCSS-github-amp-UnCSS在线效果" class="headerlink" title="UnCSS github &amp; UnCSS在线效果"></a><a class="link"   href="https://link.juejin.cn/?target=https://github.com/uncss/uncss"  title="https://github.com/uncss/uncss">UnCSS github<i class="fas fa-external-link-alt"></i></a> &amp; <a class="link"   href="https://link.juejin.cn/?target=https://uncss-online.com/"  title="https://uncss-online.com/">UnCSS在线效果<i class="fas fa-external-link-alt"></i></a></h4><p>与<code>PurifyCSS</code>类似，<code>UnCSS</code>也是一个能够检测并移除网页中未引用CSS规则的工具。不过，<code>UnCSS</code>更加注重对动态内容的支持，例如JavaScript生成的DOM元素或AJAX加载的内容。这意味着即使是在复杂的交互式页面上，也能有效去除无用样式。</p><h3 id="结合使用"><a href="#结合使用" class="headerlink" title="结合使用"></a>结合使用</h3><p>为了达到最佳效果，通常建议结合多种工具共同作用。例如，在Webpack工作流中，首先利用<code>MiniCssExtractPlugin</code>将所有CSS文件抽离成独立文件，然后借助上述提到的任何一个压缩工具对其进行进一步优化；与此同时，可以运行<code>PurifyCSS</code>或<code>UnCSS</code>来进行代码剪枝，确保只保留真正需要的样式规则。</p><h3 id="postcss"><a href="#postcss" class="headerlink" title="postcss"></a><a class="link"   href="https://link.juejin.cn/?target=https://www.postcss.com.cn/docs/postcss-architecture"  title="https://www.postcss.com.cn/docs/postcss-architecture">postcss<i class="fas fa-external-link-alt"></i></a></h3><p><img                       lazyload                     alt="image"                     data-src="https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/556e1f527037403aa549608ff8ea3e66~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg6bG85qix5YmN56uv:q75.awebp?rk3s=f64ab15b&x-expires=1734834075&x-signature=omc746WC3oI4BI00wvRp3DC5jTU="                      alt="image.png"                ></p><p>PostCSS 是一个强大的工具，它使用 JavaScript 插件来转换 CSS 代码。与传统的 CSS 预处理器不同，PostCSS 自身并不提供特定的语法或功能集，而是作为一个平台，允许开发者通过丰富的插件生态系统扩展和定制其功能。这使得 PostCSS 成为了一个灵活且高效的解决方案，适用于各种前端开发场景。</p><h4 id="主要作用"><a href="#主要作用" class="headerlink" title="主要作用"></a>主要作用</h4><ol><li><p> <strong>增强CSS功能</strong>：通过一系列插件，PostCSS 可以为标准的 CSS 添加额外的功能，如变量、混合（mixins）、嵌套规则等。这意味着开发者可以编写更简洁、更具表现力的样式表，同时保持与现有浏览器的良好兼容性</p></li><li><p> <strong>自动化任务处理</strong>：PostCSS 的插件能够自动执行许多常见的 CSS 相关任务，例如添加供应商前缀（vendor prefixes），检查代码质量（linting），以及压缩文件大小。这些操作不仅提高了工作效率，还确保了生成的 CSS 文件既高效又符合最佳实践</p></li><li><p> <strong>支持未来标准</strong>：借助像 <code>postcss-preset-env</code> 这样的插件，PostCSS 允许开发者立即采用最新的 CSS 规范和技术，即使它们尚未被所有主流浏览器完全支持。该插件会根据指定的目标浏览器列表自动将现代特性编译成向后兼容的形式</p></li><li><p> <strong>优化性能</strong>：除了简化开发流程外，PostCSS 还可以帮助改善网站的整体性能。例如，<code>cssnano</code> 插件可以在不影响视觉效果的前提下大幅缩减 CSS 文件体积；而 <code>purgecss</code> 则可用于移除未使用的样式声明，从而减少不必要的网络传输开销</p></li><li><p> <strong>促进团队协作</strong>：由于 PostCSS 支持多种格式化的输入输出，并且提供了详细的源映射（source maps）选项，因此非常适合多人协作环境下的项目管理。此外，某些插件还能强制实施统一的编码风格指南，进一步增强了代码的一致性和可维护性</p></li><li><p> <strong>与其他工具集成</strong>：作为 Node.js 生态系统的一部分，PostCSS 轻松集成了 Webpack、Gulp、Grunt 等流行的构建工具，形成了完整的前端工作流。这意味着无论你选择哪种方式组织项目，都能轻松地将 PostCSS 整合进来，享受其带来的便利</p></li></ol><h4 id="功能示例"><a href="#功能示例" class="headerlink" title="功能示例"></a>功能示例</h4><ul><li><p>  <strong>Autoprefixer</strong>：这是一个非常受欢迎的 PostCSS 插件，用于自动为 CSS 属性添加必要的浏览器前缀。它基于 Can I Use 数据库确定哪些前缀是必需的，并根据配置的目标浏览器范围进行相应的调整</p></li><li><p>  <strong>PreCSS</strong>：此插件集成了多个有用的功能，包括但不限于变量、嵌套、继承等 Sass 类似特性。它让那些习惯于预处理器语法的人能够在不改变原有工作流的情况下快速上手 PostCSS</p></li><li><p>  <strong>Stylelint</strong>：作为一种先进的 Linter 工具，Stylelint 可以帮助开发者发现潜在的问题，比如拼写错误、冗余选择器或是不符合团队约定俗成的格式化问题。这对于维持高质量的代码库至关重要</p></li></ul><h4 id="如何使用和配置-官方按使用构建工具分情况"><a href="#如何使用和配置-官方按使用构建工具分情况" class="headerlink" title="如何使用和配置 官方按使用构建工具分情况"></a>如何使用和配置 <a class="link"   href="https://link.juejin.cn/?target=https://github.com/postcss/postcss%23usage"  title="https://github.com/postcss/postcss#usage">官方按使用构建工具分情况<i class="fas fa-external-link-alt"></i></a></h4><p>使用和配置PostCSS涉及几个关键步骤，包括安装必要的工具、创建配置文件以及选择适当的插件来满足特定需求。以下是详细的指南，帮助你顺利地开始使用PostCSS。</p><h4 id="安装PostCSS"><a href="#安装PostCSS" class="headerlink" title="安装PostCSS"></a>安装PostCSS</h4><p>首先，确保你的开发环境中已经安装了Node.js，因为PostCSS依赖于Node.js环境。接着，你可以通过npm（Node Package Manager）或yarn来安装PostCSS及其所需的插件。对于全局安装PostCSS CLI，可以使用以下命令：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install -g postcss-cli</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>如果你打算在某个具体的项目中使用PostCSS，则应该在该项目根目录下创建一个<code>package.json</code>文件（如果还没有的话，可以通过<code>npm init</code>命令初始化项目），然后为该项目安装PostCSS作为本地开发依赖项：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install --save-dev postcss postcss-cli</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>此外，还需要根据项目的需要安装额外的插件，例如用于自动添加浏览器前缀的<code>autoprefixer</code>插件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install --save-dev autoprefixer</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="创建配置文件"><a href="#创建配置文件" class="headerlink" title="创建配置文件"></a>创建配置文件</h4><p>安装完成后，下一步是创建一个配置文件来指定要使用的PostCSS插件及其配置。通常，这个配置文件命名为<code>postcss.config.js</code>，并放置在项目的根目录中。下面是一个简单的例子，展示了如何配置<code>autoprefixer</code>插件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">module.exports = &#123;</span><br><span class="line">  plugins: [</span><br><span class="line">    require(&#x27;autoprefixer&#x27;)(&#123;</span><br><span class="line">      // 兼容市面上所有版本浏览器</span><br><span class="line">      browsers: [&#x27;&gt; 0%&#x27;]</span><br><span class="line">    &#125;)</span><br><span class="line">  ]</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>对于更复杂的设置，比如当你想要整合其他CSS预处理器或者应用更多的优化规则时，可以在同一个配置文件中添加多个插件。例如，结合<code>postcss-import</code>插件来导入外部样式表，或是使用<code>cssnano</code>进行代码压缩。</p><h4 id="配置Vite项目中的PostCSS"><a href="#配置Vite项目中的PostCSS" class="headerlink" title="配置Vite项目中的PostCSS"></a>配置Vite项目中的PostCSS</h4><p>如果你正在使用Vite构建工具，那么可以直接在<code>vite.config.js</code>内的<code>css.postcss</code>属性内进行PostCSS配置。例如，使用<code>postcss-preset-env</code>插件可以帮助你将最新的CSS语法转换为向后兼容的形式：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">import &#123; defineConfig &#125; from &#x27;vite&#x27;;</span><br><span class="line">const postcssPresetEnv = require(&#x27;postcss-preset-env&#x27;);</span><br><span class="line"></span><br><span class="line">export default defineConfig(&#123;</span><br><span class="line">  css: &#123;</span><br><span class="line">    postcss: &#123;</span><br><span class="line">      plugins: [postcssPresetEnv()]</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;);</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="运行PostCSS处理CSS文件"><a href="#运行PostCSS处理CSS文件" class="headerlink" title="运行PostCSS处理CSS文件"></a>运行PostCSS处理CSS文件</h4><p>完成上述配置后，你可以使用PostCSS CLI工具来运行PostCSS并处理CSS文件。例如，假设你的主CSS文件名为<code>main.css</code>，并且你想要将处理后的CSS输出到<code>build/main.css</code>，可以运行以下命令：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npx postcss main.css -o build/main.css</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>这条命令会读取<code>main.css</code>的内容，按照<code>postcss.config.js</code>中定义的规则对其进行转换，并将结果保存到指定的目标路径下。</p><h4 id="构建流程集成"><a href="#构建流程集成" class="headerlink" title="构建流程集成"></a>构建流程集成</h4><p>在实际开发过程中，PostCSS常常被集成到构建工具（如Webpack、Gulp、Grunt等）中，以便自动化地处理CSS文件并在开发和构建阶段执行编译和优化。以Webpack为例，你需要安装<code>postcss-loader</code>，并通过修改<code>webpack.config.js</code>来包含PostCSS处理逻辑：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">module.exports = &#123;</span><br><span class="line">  module: &#123;</span><br><span class="line">    rules: [</span><br><span class="line">      &#123;</span><br><span class="line">        test: /\.css$/,</span><br><span class="line">        use: [&#x27;style-loader&#x27;, &#x27;css-loader&#x27;, &#x27;postcss-loader&#x27;]</span><br><span class="line">      &#125;</span><br><span class="line">    ]</span><br><span class="line">  &#125;,</span><br><span class="line">  postcss: function() &#123;</span><br><span class="line">    return [</span><br><span class="line">      require(&#x27;autoprefixer&#x27;)(&#123; browsers: [&#x27;last 2 versions&#x27;] &#125;)</span><br><span class="line">    ];</span><br><span class="line">  &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>以上就是PostCSS的基本安装和配置流程。通过合理利用PostCSS提供的强大功能和丰富的插件库，你可以极大地简化CSS开发过程，同时确保生成的样式表既高效又符合现代Web标准的要求。</p><h3 id="CSS原子化概念"><a href="#CSS原子化概念" class="headerlink" title="CSS原子化概念"></a>CSS原子化概念</h3><p>CSS原子化（Atomic CSS）是一种<strong>CSS架构方式</strong>，它提倡<strong>将样式拆分为最小且独立的单位</strong>——即“原子”。<strong>每个原子类只包含一个或少数几个特定的样式属性</strong>，如颜色、边距、字体大小等。这些原子类可以组合起来创建复杂的样式效果，从而实现样式的模块化和复用性。与传统的面向组件的CSS编写方法不同，<strong>原子化CSS强调的是通过一系列小型、单一用途的类来构建页面，而非为每个UI组件定义专门的样式规则</strong>。</p><h4 id="核心特点"><a href="#核心特点" class="headerlink" title="核心特点"></a>核心特点</h4><ul><li>  <strong>单一样式属性</strong>：每个类名通常对应一个具体的样式属性，比如<code>.p-4</code>代表<code>padding: 4px;</code>，这使得开发者能够直观地理解类的作用。</li><li>  <strong>高度可复用</strong>：由于类是高度独立的，它们可以在不同的上下文中被自由组合使用，减少了重复定义样式的需求。</li><li>  <strong>减少冗余代码</strong>：原子化CSS有助于消除不必要的CSS文件膨胀问题，因为它避免了大量未使用的样式规则堆积。</li><li>  <strong>易于维护</strong>：当需要调整某个特定的样式时，只需更改相应的HTML标签上的类名即可，无需修改CSS文件本身。</li><li>  <strong>基于视觉功能命名</strong>：类名往往直接反映了其在界面上的表现形式，例如<code>.text-center</code>表示文本居中显示。</li></ul><h4 id="CSS原子化解决方案"><a href="#CSS原子化解决方案" class="headerlink" title="CSS原子化解决方案"></a>CSS原子化解决方案</h4><p>随着Web开发社区对高效、灵活的样式管理方案的需求增长，出现了多个优秀的CSS原子化框架和工具，其中最著名的包括：</p><h4 id="Tailwind-CSS"><a href="#Tailwind-CSS" class="headerlink" title="Tailwind CSS"></a><a class="link"   href="https://link.juejin.cn/?target=https://tailwindcss.com/"  title="https://tailwindcss.com/">Tailwind CSS<i class="fas fa-external-link-alt"></i></a></h4><p>Tailwind CSS 是目前最受欢迎的功能优先型CSS框架之一。它提供了丰富的预设样式类库，允许开发者直接在HTML中组合这些类以快速搭建界面。Tailwind的设计理念非常符合原子化CSS的原则，它的类名简洁明了，并且支持自定义主题配置。此外，Tailwind还内置了大量的实用工具类，涵盖了从布局到动画的各种场景，极大地简化了前端开发流程。</p><h4 id="Windi-CSS"><a href="#Windi-CSS" class="headerlink" title="Windi CSS"></a><a class="link"   href="https://link.juejin.cn/?target=https://windicss.org/"  title="https://windicss.org/">Windi CSS<i class="fas fa-external-link-alt"></i></a></h4><p>Windi CSS 是另一个高效的原子化CSS框架，它的工作原理类似于Tailwind，但更加注重性能优化。Windi采用了按需生成策略，只有当某些样式类真正出现在HTML文档中时才会被编译进最终输出的CSS文件里，这样可以进一步降低资源消耗。同时，Windi也支持多种插件扩展，满足不同项目的个性化需求。</p><h4 id="UnoCSS"><a href="#UnoCSS" class="headerlink" title="UnoCSS"></a><a class="link"   href="https://link.juejin.cn/?target=https://unocss.dev/"  title="https://unocss.dev/">UnoCSS<i class="fas fa-external-link-alt"></i></a></h4><p>不同于前面提到的两个框架，UnoCSS更像是一个引擎而不是固定框架。它允许用户定义自己的原子化规则集，提供了极大的灵活性。UnoCSS的核心优势在于它可以与Vite等现代构建工具无缝集成，实现了真正的按需加载机制，确保只有必要的样式才会被打包进去。此外，UnoCSS还支持自动前缀添加、媒体查询等功能，帮助开发者轻松应对跨浏览器兼容性挑战。</p><h4 id="Basscss"><a href="#Basscss" class="headerlink" title="Basscss"></a><a class="link"   href="https://link.juejin.cn/?target=https://basscss.com/"  title="https://basscss.com/">Basscss<i class="fas fa-external-link-alt"></i></a></h4><p>Basscss 是一款轻量级的原子化CSS框架，旨在提供一组简单而有效的基础样式类。尽管它的规模较小，但对于那些追求极简风格的应用程序来说却是理想的选择。Basscss遵循了原子化CSS的核心思想，即通过少量的基础类构建出复杂多变的用户界面。不过，相比其他更全面的框架，Basscss提供的功能相对有限，更适合小型项目或者作为更大框架的一部分使用。</p><h4 id="Tachyons"><a href="#Tachyons" class="headerlink" title="Tachyons"></a><a class="link"   href="https://link.juejin.cn/?target=https://tachyons.io/docs/"  title="https://tachyons.io/docs/">Tachyons<i class="fas fa-external-link-alt"></i></a></h4><p>Tachyons 是一个专注于速度和响应式的原子化CSS框架。它不仅拥有庞大的样式类库，而且经过精心设计以保证良好的渲染性能。Tachyons的类名遵循了一套清晰易懂的命名约定，便于记忆和使用。该框架特别适合需要快速迭代的设计原型或是要求极高加载效率的应用场景。</p><p>综上所述，CSS原子化不仅仅是一个理论上的概念，而是已经被广泛应用于实际项目中的有效实践。通过采用上述任何一个或多个框架，开发者可以获得更好的开发体验、更高的生产力以及更优质的用户体验。值得注意的是，虽然原子化CSS带来了诸多便利之处，但<strong>它也可能导致HTML标记变得冗长复杂维护困难</strong>，因此在选择是否采用此方法之前，应当充分考虑项目的具体情况和技术栈特性。</p><h2 id="构建工具和脚手架"><a href="#构建工具和脚手架" class="headerlink" title="构建工具和脚手架"></a>构建工具和脚手架</h2><p>在2024年，前端开发领域继续快速发展，构建工具和脚手架作为提高开发效率、简化项目初始化过程的关键组成部分，也在不断演进。这一年中，一些构建工具和脚手架因其卓越的性能、简便的配置以及强大的社区支持而脱颖而出。</p><h3 id="构建工具-将开发者编写的源代码转换成浏览器能够理解和执行的形式"><a href="#构建工具-将开发者编写的源代码转换成浏览器能够理解和执行的形式" class="headerlink" title="构建工具 (将开发者编写的源代码转换成浏览器能够理解和执行的形式)"></a>构建工具 (将开发者编写的源代码转换成浏览器能够理解和执行的形式)</h3><h4 id="Vite"><a href="#Vite" class="headerlink" title="Vite"></a><a class="link"   href="https://link.juejin.cn/?target=https://cn.vitejs.dev/"  title="https://cn.vitejs.dev/">Vite<i class="fas fa-external-link-alt"></i></a></h4><p>Vite 是一个新兴的构建工具（都vite6.0了），它凭借其出色的启动速度和热更新能力，在2024年成为了许多开发者的新宠。与传统的 Webpack 相比，Vite 在开发阶段的构建速度提升了数倍，这得益于它基于原生 ES 模块（ESM）的工作原理。Vite 通过即时编译请求模块来实现快速反馈循环，并且提供了开箱即用的 TypeScript 支持。此外，Vite 还拥有丰富的插件生态系统，能够满足多样化的开发需求。对于 Vue 生态系统而言，Vite 已经成为新项目的首选构建工具。双引擎（<a class="link"   href="https://link.juejin.cn/?target=https://esbuild.bootcss.com/"  title="https://esbuild.bootcss.com/">esbuild<i class="fas fa-external-link-alt"></i></a>和<a class="link"   href="https://link.juejin.cn/?target=https://www.rollupjs.com/"  title="https://www.rollupjs.com/">rollup<i class="fas fa-external-link-alt"></i></a>）</p><h4 id="Webpack"><a href="#Webpack" class="headerlink" title="Webpack"></a><a class="link"   href="https://link.juejin.cn/?target=https://webpack.p2hp.com/"  title="https://webpack.p2hp.com/">Webpack<i class="fas fa-external-link-alt"></i></a></h4><p>尽管有新的挑战者出现，Webpack 仍然是最流行的 JavaScript 应用构建工具之一。它以其灵活性和强大的功能著称，支持模块化开发、代码分割、懒加载等功能。Webpack 的插件机制允许开发者根据需要定制化构建流程，适用于各种规模的应用程序。然而，随着其他工具如 Vite 的崛起，Webpack 面临着一定的竞争压力。为了保持竞争力，Webpack 社区也在持续改进其性能和用户体验。</p><h4 id="Turbopack"><a href="#Turbopack" class="headerlink" title="Turbopack"></a><a class="link"   href="https://link.juejin.cn/?target=https://vercel.com/blog/turbopack"  title="https://vercel.com/blog/turbopack">Turbopack<i class="fas fa-external-link-alt"></i></a></h4><p>Turbopack 是由 Webpack 的作者使用 Rust 开发的一款高性能打包工具，旨在对抗 Vite。它的目标是提供更快的增量构建时间和更小的输出文件大小。虽然 Turbopack 尚处于早期发展阶段，但它已经吸引了部分开发者的注意，并有可能在未来成为重要的构建选项之一。</p><h4 id="Rspack"><a href="#Rspack" class="headerlink" title="Rspack"></a><a class="link"   href="https://link.juejin.cn/?target=https://rspack.dev/"  title="https://rspack.dev/">Rspack<i class="fas fa-external-link-alt"></i></a></h4><p>Rspack 是一款基于 Rust 编写的高性能 JavaScript 打包工具，它被设计成 Webpack 的直接替代品，并且提供了与 Webpack 生态系统的高度兼容性。这意味着开发者可以轻松地将现有的 Webpack 项目迁移到 Rspack 上，同时享受到显著的构建速度提升。根据官方提供的信息，Rspack 可以提供比 Webpack 快 5 到 10 倍的构建性能</p><h3 id="脚手架-提供界面交互和基础工程模板"><a href="#脚手架-提供界面交互和基础工程模板" class="headerlink" title="脚手架 (提供界面交互和基础工程模板)"></a>脚手架 (提供界面交互和基础工程模板)</h3><h4 id="Create-React-App-CRA"><a href="#Create-React-App-CRA" class="headerlink" title="Create React App (CRA)"></a><a class="link"   href="https://link.juejin.cn/?target=https://cra.nodejs.cn/"  title="https://cra.nodejs.cn/">Create React App (CRA)<i class="fas fa-external-link-alt"></i></a></h4><p>Create React App 是官方推荐的 React 应用创建工具，它为开发者提供了一个无需配置的环境来快速搭建 React 项目。CRA 内置了对 Babel、ESLint 和 Webpack 的支持，使得开发者可以专注于业务逻辑而非繁琐的工具链设置。尽管 Vite 等新型构建工具带来了挑战，但 CRA 依然保持着广泛的用户基础，并且不断更新以适应最新的 React 版本和技术趋势。</p><h4 id="Vue-CLI"><a href="#Vue-CLI" class="headerlink" title="Vue CLI"></a><a class="link"   href="https://link.juejin.cn/?target=https://cli.vuejs.org/"  title="https://cli.vuejs.org/">Vue CLI<i class="fas fa-external-link-alt"></i></a></h4><p>Vue CLI 是 Vue.js 官方提供的命令行工具，用于生成完整的项目结构并集成常用的构建工具和库。它不仅简化了项目的初始设置，还提供了灵活的插件系统，允许开发者轻松扩展功能。Vue CLI 支持多种模板选择，包括但不限于 Webpack、Parcel 和 Vite，这让开发者可以根据具体需求做出最佳选择。特别是结合 Vite 使用时，Vue CLI 可以为开发者带来极佳的开发体验。</p><h4 id="Angular-CLI"><a href="#Angular-CLI" class="headerlink" title="Angular CLI"></a><a class="link"   href="https://link.juejin.cn/?target=https://angular.dev/tools/cli"  title="https://angular.dev/tools/cli">Angular CLI<i class="fas fa-external-link-alt"></i></a></h4><p>Angular CLI 是 Angular 团队维护的一个命令行界面工具，帮助开发者快速启动 Angular 应用。它集成了诸如路由配置、状态管理等常用特性，并且内置了对服务端渲染（SSR）、Progressive Web Apps (PWA) 等高级特性的支持。Angular CLI 的优势在于其紧密集成 Angular 生态系统的能力，使得开发者可以利用丰富的官方资源和文档进行高效开发。</p><h4 id="Next-js"><a href="#Next-js" class="headerlink" title="Next.js"></a><a class="link"   href="https://link.juejin.cn/?target=https://nextjs.org/"  title="https://nextjs.org/">Next.js<i class="fas fa-external-link-alt"></i></a></h4><p>Next.js 是一个React框架，它不仅仅是一个简单的脚手架工具，而是提供了完整的解决方案，包括服务器端渲染（SSR）、静态站点生成（SSG）、API路由等功能。Next.js 的特点是易于上手且功能强大，适合构建从简单博客到复杂电子商务平台等各种类型的Web应用。随着React Server Components 和 Server Actions 等新技术的引入，Next.js 在2024年的地位更加稳固。</p><h4 id="Nuxtjs"><a href="#Nuxtjs" class="headerlink" title="Nuxtjs"></a><a class="link"   href="https://link.juejin.cn/?target=https://www.nuxtjs.cn/"  title="https://www.nuxtjs.cn/">Nuxtjs<i class="fas fa-external-link-alt"></i></a></h4><p>Nuxt.js 是一个基于 Vue.js 的框架，它为开发者提供了一种直观且可扩展的方式来创建类型安全、性能优越以及适合生产环境的全栈 Web 应用程序。Nuxt.js 不仅简化了服务器端渲染（SSR）和静态站点生成（SSG）应用的构建过程，还通过其内置的功能如自动路由、中间件支持、布局支持等特性极大地提升了开发效率</p><h4 id="Nestjs"><a href="#Nestjs" class="headerlink" title="Nestjs"></a><a class="link"   href="https://link.juejin.cn/?target=https://docs.nestjs.com/"  title="https://docs.nestjs.com/">Nestjs<i class="fas fa-external-link-alt"></i></a></h4><p>NestJS 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的框架，它使用渐进式 JavaScript 构建，并且完全支持 TypeScript（尽管开发者仍然可以选择使用纯 JavaScript）。NestJS 的设计理念深受 Angular 框架的影响，同时借鉴了后端开发中常用的 Java 技术栈 Spring 框架的最佳实践</p><p>综上所述，2024年的前端构建工具和脚手架市场呈现出多元化的发展态势。无论是追求极致性能还是希望获得全面的功能支持，开发者都能找到适合自己项目需求的理想工具。值得注意的是，技术进步永无止境，未来几年内可能会有更多的创新涌现，推动整个行业向前发展。</p><h2 id="前端主流框架技术"><a href="#前端主流框架技术" class="headerlink" title="前端主流框架技术"></a>前端主流框架技术</h2><p>在2024年，前端开发领域继续快速发展，主流框架也在不断进化以适应新的需求和技术趋势。根据最新的资料，<strong>React、Vue、Angular仍然是最受欢迎的三大前端框架</strong>，但同时一些新兴框架如Svelte和SolidJS也逐渐崭露头角。</p><h3 id="React-js"><a href="#React-js" class="headerlink" title="React.js"></a><a class="link"   href="https://link.juejin.cn/?target=https://www.php.cn/doc/react/"  title="https://www.php.cn/doc/react/">React.js<i class="fas fa-external-link-alt"></i></a></h3><p>React 作为由Facebook维护的JavaScript库，在2024年依然是构建用户界面组件的强大工具。React 19版本引入了React Server Components（RSC），这是一种新的架构风格，它允许开发者编写只在服务器上运行的React组件，并且可以与客户端组件无缝协作。此外，React团队还在持续扩展其生态系统，包括React Compiler和Server Actions等功能，这些特性不仅增强了React的能力，还进一步提升了开发者的体验。React的优势在于其庞大的社区支持、丰富的插件系统以及虚拟DOM带来的性能优势。</p><h3 id="Vue-js"><a href="#Vue-js" class="headerlink" title="Vue.js"></a><a class="link"   href="https://link.juejin.cn/?target=https://cn.vuejs.org/"  title="https://cn.vuejs.org/">Vue.js<i class="fas fa-external-link-alt"></i></a></h3><p>Vue 3.4版本带来了显著的技术革新，例如完全重写的解析器提高了编译速度，更快的单文件组件（SFC）编译流程，以及一个经过优化的响应式系统，提高了重新计算的效率。更重要的是，Vue正在开发中的Vapor模式，这是一种可选的、以性能为导向的编译策略，旨在生成比现有方法更高效的代码，甚至可以在所有组件中使用时消除对虚拟DOM的需求，从而减少打包大小。此外，Vue 3.4还稳定了<code>defineModel</code>宏，并引入了v-bind简写等新特性，进一步简化了开发过程。</p><h3 id="Angular-js"><a href="#Angular-js" class="headerlink" title="Angular.js"></a><a class="link"   href="https://link.juejin.cn/?target=https://angular.dev/"  title="https://angular.dev/">Angular.js<i class="fas fa-external-link-alt"></i></a></h3><p>Angular 在2024年的更新中引入了信号机制、可延迟视图、NgOptimizedImage组件等一系列新功能，旨在提高应用性能并改善开发者体验。特别是信号机制，它提供了一种更加直观的方式来进行状态管理和组件间通信。非破坏性预加载和即将推出的部分预加载特性，则有助于加快页面加载速度，提升用户体验。尽管Angular的学习曲线较为陡峭，但对于大型复杂的企业级应用来说，Angular仍然是一个强有力的选择。</p><h3 id="Svelte-js"><a href="#Svelte-js" class="headerlink" title="Svelte.js"></a><a class="link"   href="https://link.juejin.cn/?target=https://www.svelte.cn/"  title="https://www.svelte.cn/">Svelte.js<i class="fas fa-external-link-alt"></i></a></h3><p>Svelte 是一个相对较新的框架，但在2024年已经获得了相当大的关注。它的独特之处在于编译时框架的概念，这意味着Svelte会在构建阶段处理掉大部分逻辑，最终生成的代码没有额外的运行时开销，这使得应用程序启动更快、体积更小。Svelte 4版本强调细粒度响应性，允许开发者在全栈应用中使用，并提供了强大的开发者体验，包括单次飞行变异以避免服务器上的瀑布流效应，请求和资源去重等功能。</p><h3 id="SolidJS"><a href="#SolidJS" class="headerlink" title="SolidJS"></a><a class="link"   href="https://link.juejin.cn/?target=https://www.solidjs.com/"  title="https://www.solidjs.com/">SolidJS<i class="fas fa-external-link-alt"></i></a></h3><p>SolidJS以其细粒度响应性和高效的性能而闻名，它允许开发者创建高性能的应用程序，而不需要担心复杂的依赖跟踪或手动管理副作用。SolidStart是用于构建SolidJS应用的一个框架，在最新版本中，它整合了多个独立的包以提供完整的功能，并且每个部分都可以被替换为开发者自己的实现。这种灵活性使得SolidJS成为那些寻求快速迭代和高度定制化解决方案的理想选择。</p><h3 id="其他值得关注的框架"><a href="#其他值得关注的框架" class="headerlink" title="其他值得关注的框架"></a>其他值得关注的框架</h3><p>除了上述提到的主要框架外，还有一些其他值得注意的选项，如Astro、Next.js、Nuxt.js等。其中，Astro作为一个前沿的静态网站构建器，因其对性能和开发者体验的深入优化而在业界引起了广泛关注；Next.js则是React生态中最受欢迎的框架之一，特别适合需要服务器端渲染的应用；而Nuxt.js则专注于Vue生态，提供了类似的服务器端渲染能力。</p><p>综上所述，2024年的前端开发环境充满了机遇与挑战，从成熟稳定的React、Vue、Angular到快速崛起的Svelte和SolidJS，每个框架都有其独特的魅力和适用场景。开发者应根据项目需求和个人偏好来选择最适合自己的工具链。随着技术的进步，未来几年内我们可以期待更多令人兴奋的变化和发展。</p><h2 id="写在结尾"><a href="#写在结尾" class="headerlink" title="写在结尾"></a>写在结尾</h2><p>2024年，前端工程化方案和技术继续向着智能化、模块化、跨平台的方向演进。随着Web技术的发展，前端开发不仅在框架和工具链的选择上更加多样化，而且在构建高性能、可维护的应用方面也提出了更高的要求。以下是当前主流的前端工程化方案和技术趋势。</p><h3 id="智能化工具与AI辅助开发"><a href="#智能化工具与AI辅助开发" class="headerlink" title="智能化工具与AI辅助开发"></a>智能化工具与AI辅助开发</h3><p>人工智能（AI）正在深刻改变前端开发的方式。AI驱动的开发工具如cursor、GitHub Copilot、CodeGeeX等已经能够在项目中自动完成一些重复性的编码任务，并根据描述自动生成代码片段或继续书写代码。这类工具不仅提高了开发效率，还降低了新手学习成本，使得开发者可以更专注于业务逻辑的设计。此外，AI还可以用于自动化测试、智能优化以及个性化用户体验等多个方面，为前端开发带来更多可能性。</p><h3 id="微前端架构"><a href="#微前端架构" class="headerlink" title="微前端架构"></a>微前端架构</h3><p>微前端作为一种将大型单体应用拆分为多个独立部署的小型应用的方法，在2024年得到了广泛应用。通过采用微前端架构，企业能够实现不同团队并行开发、快速迭代的同时保持系统的灵活性和稳定性。目前流行的微前端解决方案包括qiankun、Module Federation（模块联邦）等，它们提供了不同的隔离机制和服务通信方式来满足多样化的应用场景需求。例如，Module Federation允许不同技术栈的应用共享公共模块，从而减少了冗余代码并提升了整体性能。</p><h3 id="WebAssembly-Wasm-的普及"><a href="#WebAssembly-Wasm-的普及" class="headerlink" title="WebAssembly (Wasm) 的普及"></a>WebAssembly (Wasm) 的普及</h3><p>WebAssembly作为一种高效的字节码格式，因其接近本机执行的速度而受到越来越多的关注。它允许开发者使用C/C++、Rust等多种编程语言编写高性能的应用程序，并将其编译成可以在浏览器环境中运行的wasm文件。特别是在处理复杂计算任务如图像处理、3D渲染等领域时，WebAssembly表现出了极大的优势。2024年预计会有更多框架开始支持WebAssembly，进一步推动其在前端领域的应用范围。</p><h3 id="静态站点生成器-SSG"><a href="#静态站点生成器-SSG" class="headerlink" title="静态站点生成器(SSG)"></a>静态站点生成器(SSG)</h3><p>静态站点生成器（SSG）如Gatsby、Next.js、Nuxt.js等已经成为构建高效网站的重要手段之一。这些工具可以通过预渲染页面内容生成静态HTML文件，显著提高首屏加载速度并改善SEO效果。对于那些不需要频繁更新内容的企业官网或者博客类站点来说，SSG提供了一种简单且有效的解决方案。同时，结合服务端渲染（SSR），还可以兼顾动态数据展示的需求。</p><h3 id="跨平台开发-推荐看看大前端跨端开发指南"><a href="#跨平台开发-推荐看看大前端跨端开发指南" class="headerlink" title="跨平台开发 推荐看看大前端跨端开发指南"></a>跨平台开发 <a class="link"   href="https://s.juejin.cn/ds/iUhLCEut/"  title="https://s.juejin.cn/ds/iUhLCEut/">推荐看看大前端跨端开发指南<i class="fas fa-external-link-alt"></i></a></h3><p>为了减少多平台适配的工作量并提升开发效率，“一次编写，各处运行”的理念越来越受到重视。React Native、Flutter等移动端跨平台框架让开发者可以用一套代码库创建iOS和Android应用；而对于桌面应用程序，则有Electron、Tauri等选择。这些框架不仅简化了开发流程，同时也保证了用户体验的一致性。</p><h3 id="前端性能优化"><a href="#前端性能优化" class="headerlink" title="前端性能优化"></a>前端性能优化</h3><p>随着用户期望的不断提高，性能优化成为了前端开发中的关键考虑因素。开发者需要关注资源的有效加载、动画平滑过渡、无障碍设计等方面，以确保所有用户都能获得优质的体验。具体措施包括但不限于：懒加载图片和其他非必要资源、利用CDN加速全球访问、实施缓存策略、压缩传输的数据量等。此外，Core Web Vitals等评估标准的普及促使开发者更加注重核心指标如LCP（最大内容绘制）、FID（首次输入延迟）等。</p><h3 id="TypeScript-和静态类型检查"><a href="#TypeScript-和静态类型检查" class="headerlink" title="TypeScript 和静态类型检查"></a>TypeScript 和静态类型检查</h3><p>TypeScript作为JavaScript的超集，凭借其静态类型系统有效减少了潜在错误的发生几率，并提高了代码质量和可读性。2024年，TypeScript的使用预计将更加普遍，尤其是在大型团队和企业级项目中。除了增强代码健壮性和开发效率外，TypeScript还带来了更好的IDE支持，比如代码补全和错误提示等功能。</p><h3 id="构建自动化与CI-CD"><a href="#构建自动化与CI-CD" class="headerlink" title="构建自动化与CI/CD"></a>构建自动化与CI/CD</h3><p>构建自动化是指利用脚本或专门的工具链来完成重复性的任务，例如代码格式化、单元测试执行、ESLint检查等。持续集成/持续部署（CI/CD）则进一步扩展了这一概念，确保每次提交都能经过严格的验证流程后自动发布到生产环境。常用的CI/CD平台包括GitHub Actions、GitLab CI、CircleCI等，它们提供了丰富的插件生态系统，可以帮助团队快速设置并运行流水线</p><h3 id="环境变量管理"><a href="#环境变量管理" class="headerlink" title="环境变量管理"></a>环境变量管理</h3><p>在多环境部署的情况下，合理配置环境变量至关重要。通过<code>.env</code>文件或其他形式的配置机制，开发者可以在不同阶段（如开发、测试、生产）之间轻松切换API地址、密钥等敏感信息。以Vue CLI为例，它内置了对多种模式的支持，允许用户通过命令行参数指定要使用的环境配置文件，同时结合cross-env这样的跨平台解决方案，确保所有操作系统下都能正确读取NODE_ENV等关键变量</p><h3 id="代码质量控制"><a href="#代码质量控制" class="headerlink" title="代码质量控制"></a>代码质量控制</h3><p>为了保证代码的一致性和高质量，许多项目都会引入静态分析工具，如ESLint用于JavaScript/TypeScript代码规范检查；Prettier负责统一代码风格；Stylelint则是针对CSS/SASS/Less等样式文件的审查利器。这些工具往往可以通过编辑器插件直接集成到日常编码过程中，实时给出反馈，帮助开发者养成良好的习惯</p><p>综上所述，2024年的<strong>前端工程化不仅仅局限于某个特定的技术或工具</strong>，而是涵盖了<strong>从开发流程到最终产品交付的全过程</strong>。面对不断变化的技术环境，持续学习新技术、紧跟行业发展步伐将是每个前端工程师成长道路上不可或缺的一部分。通过合理运用上述提到的各项技术和方法，我们可以构建出既美观又实用的现代化Web应用，为用户提供卓越的数字体验。</p><p>本文转自 <a class="link"   href="https://juejin.cn/post/7448191774537842714#heading-0" >https://juejin.cn/post/7448191774537842714#heading-0<i class="fas fa-external-link-alt"></i></a>，如有侵权，请联系删除。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;何为前端工程化&quot;&gt;&lt;a href=&quot;#何为前端工程化&quot; class=&quot;headerlink&quot; title=&quot;何为前端工程化&quot;&gt;&lt;/a&gt;何为前端工程化&lt;/h1&gt;&lt;p&gt;前端工程化是指将软件工程的原理和方法应用到前端开发中，以提高开发效率、代码质量和可维护性。随着 We</summary>
      
    
    
    
    <category term="frontend" scheme="https://wukong1024.github.io/categories/frontend/"/>
    
    
    <category term="frontend" scheme="https://wukong1024.github.io/tags/frontend/"/>
    
    <category term="前端" scheme="https://wukong1024.github.io/tags/%E5%89%8D%E7%AB%AF/"/>
    
  </entry>
  
  <entry>
    <title>终端</title>
    <link href="https://wukong1024.github.io/2022/06/06/%E7%BB%88%E7%AB%AF/"/>
    <id>https://wukong1024.github.io/2022/06/06/%E7%BB%88%E7%AB%AF/</id>
    <published>2022-06-06T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="终端"><a href="#终端" class="headerlink" title="终端"></a>终端</h1><h2 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h2><h3 id="git-bash"><a href="#git-bash" class="headerlink" title="git bash"></a>git bash</h3><p>安装git，添加到path。</p><p>Windows Terminal(简称WT)中新增 名称 <code>Git Bash</code>(自定义)，命令行<code>C:\wk\Code\Git\bin\bash.exe --login -i</code>，配置图标和路径。</p><p>在WT<code>启动</code>选项卡，设置为默认配置文件。</p><h4 id="git-prompt-sh"><a href="#git-prompt-sh" class="headerlink" title="git-prompt.sh"></a>git-prompt.sh</h4><p>自定义终端显示，修改安装目录中的<code>git-prompt.sh</code>文件，参考<a class="link"   href="https://zhuanlan.zhihu.com/p/340003720sss" >PS1配置<i class="fas fa-external-link-alt"></i></a>：<a class="link"   href="https://zhuanlan.zhihu.com/p/340003720sss%E3%80%82" >https://zhuanlan.zhihu.com/p/340003720sss。<i class="fas fa-external-link-alt"></i></a></p><p><a name="###micro"></a></p><h3 id="micro-editor"><a href="#micro-editor" class="headerlink" title="micro-editor"></a>micro-editor</h3><p>下载<a class="link"   href="https://github.com/zyedidia/micro/releases/tag/v2.0.11" >micro-editor<i class="fas fa-external-link-alt"></i></a>：<a class="link"   href="https://github.com/zyedidia/micro/releases/tag/v2.0.11%EF%BC%8C%E6%B7%BB%E5%8A%A0%E5%88%B0path,%E5%8F%AF%E4%BB%A5%E5%A4%8D%E5%88%B6%E4%B8%80%E4%BB%BD%E5%B9%B6%E9%87%8D%E5%91%BD%E5%90%8D%60edit%60" >https://github.com/zyedidia/micro/releases/tag/v2.0.11，添加到path,可以复制一份并重命名`edit`<i class="fas fa-external-link-alt"></i></a></p><blockquote><p>If you open micro and it doesn’t seem like syntax highlighting is working, this is probably because you are using a terminal which does not support 256 color mode. Try changing the color scheme to simple by pressing <code>Ctrl-e</code> in micro and typing <code>set colorscheme simple</code>.</p></blockquote><h3 id="bat"><a href="#bat" class="headerlink" title="bat"></a>bat</h3><p><a class="link"   href="https://github.com/sharkdp/bat" >bat<i class="fas fa-external-link-alt"></i></a>：<a class="link"   href="https://github.com/sharkdp/bat%EF%BC%8C%E7%B1%BB%E4%BC%BC" >https://github.com/sharkdp/bat，类似<i class="fas fa-external-link-alt"></i></a> cat(1)，但带有 git 集成和语法高亮。</p><p>下载，添加到path，覆盖cat 修改/usr/bin/cat.exe为cat_copy.exe 。</p><h3 id="fd"><a href="#fd" class="headerlink" title="fd"></a>fd</h3><p><a class="link"   href="https://github.com/sharkdp/fd" >fd<i class="fas fa-external-link-alt"></i></a>：<a class="link"   href="https://github.com/sharkdp/fd%EF%BC%8C%E6%9B%BF%E4%BB%A3%60find%60" >https://github.com/sharkdp/fd，替代`find`<i class="fas fa-external-link-alt"></i></a></p><p>下载，添加到path</p><h3 id="chsrc"><a href="#chsrc" class="headerlink" title="chsrc"></a>chsrc</h3><p>全平台替换源</p><p><a class="link"   href="https://github.com/RubyMetric/chsrc" >chsrc<i class="fas fa-external-link-alt"></i></a>： <a class="link"   href="https://github.com/RubyMetric/chsrc" >https://github.com/RubyMetric/chsrc<i class="fas fa-external-link-alt"></i></a></p><h3 id="yazi"><a href="#yazi" class="headerlink" title="yazi"></a>yazi</h3><p>搭配 zoxide，fd</p><h3 id="Starship"><a href="#Starship" class="headerlink" title="Starship"></a>Starship</h3><p>轻量、迅速、可无限定制的高颜值终端，<a class="link"   href="https://github.com/starship/starship/blob/master/docs/zh-CN/guide/README.md" >Starship<i class="fas fa-external-link-alt"></i></a>。</p><p>到<code>releases</code>中下载并添加到path，修改<code>PowerShell</code>样式。</p><p>新建 <code>~/.config/starship.toml</code>,设置<a class="link"   href="https://starship.rs/presets/" >configuration prese<i class="fas fa-external-link-alt"></i></a></p><h3 id="zoxide"><a href="#zoxide" class="headerlink" title="zoxide"></a>zoxide</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">eval</span> <span class="string">&quot;<span class="subst">$(starship init bash)</span>&quot;</span></span><br><span class="line"><span class="built_in">eval</span> <span class="string">&quot;<span class="subst">$(zoxide init bash)</span>&quot;</span></span><br><span class="line"><span class="built_in">eval</span> <span class="string">&quot;<span class="subst">$(fzf --bash)</span>&quot;</span></span><br></pre></td></tr></table></figure><h2 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h2><h3 id="Bash-it"><a href="#Bash-it" class="headerlink" title="Bash-it"></a>Bash-it</h3><p><a class="link"   href="https://github.com/Bash-it/bash-it" >Bash-it<i class="fas fa-external-link-alt"></i></a>,修改<code>~/.bash_profile or ~/.bashrc</code>,</p><p><a class="link"   href="https://bash-it.readthedocs.io/en/latest/" >doc<i class="fas fa-external-link-alt"></i></a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [ -f ~/.bash_aliases ]; <span class="keyword">then</span></span><br><span class="line">    . ~/.bash_aliases</span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">export</span> BASH_IT_THEME=<span class="string">&#x27;candy2&#x27;</span> <span class="comment"># ~/.bash_it/themes</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="tldr"><a href="#tldr" class="headerlink" title="tldr"></a>tldr</h3><p><a class="link"   href="https://github.com/tldr-pages/tldr" >tldr<i class="fas fa-external-link-alt"></i></a>: Too Long; Didn’t Read，替代man</p><h3 id="micro-amp-bat-amp-fd"><a href="#micro-amp-bat-amp-fd" class="headerlink" title="micro &amp; bat &amp; fd"></a>micro &amp; bat &amp; fd</h3><p>安装参考 <a href="###micro">##Window/###micro-editor</a></p><p>安装参考 <a href="###bat">##Window/###bat</a></p><p>安装参考 <a href="###fd">##Window/###fd</a></p><p>添加到 <code>.bash_aliases</code></p><ul><li><a class="link"   href="https://itsfoss.com/homebrew-linux/" >安装brew<i class="fas fa-external-link-alt"></i></a></li><li>[micro](curl <a class="link"   href="https://getmic.ro/" >https://getmic.ro<i class="fas fa-external-link-alt"></i></a> | bash)</li></ul><p><em>brew</em></p><ul><li>nushell</li><li>tealdeer</li><li>starship</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 忽略大小写</span></span><br><span class="line"><span class="built_in">shopt</span> -s nocaseglob</span><br><span class="line"><span class="built_in">bind</span> <span class="string">&quot;set completion-ignore-case on&quot;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;终端&quot;&gt;&lt;a href=&quot;#终端&quot; class=&quot;headerlink&quot; title=&quot;终端&quot;&gt;&lt;/a&gt;终端&lt;/h1&gt;&lt;h2 id=&quot;Windows&quot;&gt;&lt;a href=&quot;#Windows&quot; class=&quot;headerlink&quot; title=&quot;Windows&quot;&gt;&lt;/</summary>
      
    
    
    
    <category term="software" scheme="https://wukong1024.github.io/categories/software/"/>
    
    
    <category term="笔记" scheme="https://wukong1024.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="software" scheme="https://wukong1024.github.io/tags/software/"/>
    
  </entry>
  
  <entry>
    <title>KK_70</title>
    <link href="https://wukong1024.github.io/2022/04/28/KK_70/"/>
    <id>https://wukong1024.github.io/2022/04/28/KK_70/</id>
    <published>2022-04-28T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<ul><li><p>About 99% of the time, the right time is right now.</p></li><li><p>No one is as impressed with your possessions as you are.</p></li><li><p>Dont ever work for someone you dont want to become.</p></li><li><p>Cultivate 12 people who love you, because they are worth more than 12 million people who like you.</p></li><li><p>Dont keep making the same mistakes; try to make new mistakes.</p></li><li><p>If you stop to listen to a musician or street performer for more than a minute, you owe them a dollar.</p></li><li><p>Anything you say before the word “but” does not count.</p></li><li><p>When you forgive others, they may not notice, but you will heal. Forgiveness is not something we do for others; it is a gift to ourselves.</p></li><li><p>Courtesy costs nothing. Lower the toilet seat after use. Let the people in the elevator exit before you enter. Return shopping carts to their designated areas. When you borrow something, return it better shape (filled up, cleaned) than when you got it.</p></li><li><p>Whenever there is an argument between two sides, find the third side.</p></li><li><p>Efficiency is highly overrated; Goofing off is highly underrated. Regularly scheduled sabbaths, sabbaticals, vacations, breaks, aimless walks and time off are essential for top performance of any kind. The best work ethic requires a good rest ethic.</p></li><li><p>When you lead, your real job is to create more leaders, not more followers.</p></li><li><p>Criticize in private, praise in public.</p></li><li><p>Life lessons will be presented to you in the order they are needed. Everything you need to master the lesson is within you. Once you have truly learned a lesson, you will be presented with the next one. If you are alive, that means you still have lessons to learn.</p></li><li><p>It is the duty of a student to get everything out of a teacher, and the duty of a teacher to get everything out of a student.</p></li><li><p>If winning becomes too important in a game, change the rules to make it more fun. Changing rules can become the new game.</p></li><li><p>Ask funders for money, and they’ll give you advice; but ask for advice and they’ll give you money.</p></li><li><p>Productivity is often a distraction. Don’t aim for better ways to get through your tasks as quickly as possible, rather aim for better tasks that you never want to stop doing.</p></li><li><p>Immediately pay what you owe to vendors, workers, contractors. They will go out of their way to work with you first next time.</p></li><li><p>The biggest lie we tell ourselves is “I dont need to write this down because I will remember it.”</p></li><li><p>Your growth as a conscious being is measured by the number of uncomfortable conversations you are willing to have.</p></li><li><p>Speak confidently as if you are right, but listen carefully as if you are wrong.</p></li><li><p>Handy measure: the distance between your fingertips of your outstretched arms at shoulder level is your height.</p></li><li><p>The consistency of your endeavors (exercise, companionship, work) is more important than the quantity. Nothing beats small things done every day, which is way more important than what you do occasionally.</p></li><li><p>Making art is not selfish; it’s for the rest of us. If you don’t do your thing, you are cheating us.</p></li><li><p>Never ask a woman if she is pregnant. Let her tell you if she is.</p></li><li><p>Three things you need: The ability to not give up something till it works, the ability to give up something that does not work, and the trust in other people to help you distinguish between the two.</p></li><li><p>When public speaking, pause frequently. Pause before you say something in a new way, pause after you have said something you believe is important, and pause as a relief to let listeners absorb details.</p></li><li><p>There is no such thing as being “on time.” You are either late or you are early. Your choice.</p></li><li><p>Ask anyone you admire: Their lucky breaks happened on a detour from their main goal. So embrace detours. Life is not a straight line for anyone.</p></li><li><p>The best way to get a correct answer on the internet is to post an obviously wrong answer and wait for someone to correct you.</p></li><li><p>You’ll get 10x better results by elevating good behavior rather than punishing bad behavior, especially in children and animals.</p></li><li><p>Spend as much time crafting the subject line of an email as the message itself because the subject line is often the only thing people read.</p></li><li><p>Don’t wait for the storm to pass; dance in the rain.</p></li><li><p>When checking references for a job applicant, employers may be reluctant or prohibited from saying anything negative, so leave or send a message that says, “Get back to me if you highly recommend this applicant as super great.” If they don’t reply take that as a negative.</p></li><li><p>Use a password manager: Safer, easier, better.</p></li><li><p>Half the skill of being educated is learning what you can ignore.</p></li><li><p>The advantage of a ridiculously ambitious goal is that it sets the bar very high so even in failure it may be a success measured by the ordinary.</p></li><li><p>A great way to understand yourself is to seriously reflect on everything you find irritating in others.</p></li><li><p>Keep all your things visible in a hotel room, not in drawers, and all gathered into one spot. That way you’ll never leave anything behind. If you need to have something like a charger off to the side, place a couple of other large items next to it, because you are less likely to leave 3 items behind than just one.</p></li><li><p>Denying or deflecting a compliment is rude. Accept it with thanks, even if you believe it is not deserved.</p></li><li><p>Always read the plaque next to the monument.</p></li><li><p>When you have some success, the feeling of being an imposter can be real. Who am I fooling? But when you create things that only you — with your unique talents and experience — can do, then you are absolutely not an imposter. You are the ordained. It is your duty to work on things that only you can do.</p></li><li><p>What you do on your bad days matters more than what you do on your good days.</p></li><li><p>Make stuff that is good for people to have.</p></li><li><p>When you open paint, even a tiny bit, it will always find its way to your clothes no matter how careful you are. Dress accordingly.</p></li><li><p>To keep young kids behaving on a car road trip, have a bag of their favorite candy and throw a piece out the window each time they misbehave.</p></li><li><p>You cannot get smart people to work extremely hard just for money.</p></li><li><p>When you don’t know how much to pay someone for a particular task, ask them “what would be fair” and their answer usually is.</p></li><li><p>90% of everything is crap. If you think you don’t like opera, romance novels, TikTok, country music, vegan food, NFTs, keep trying to see if you can find the 10% that is not crap.</p></li><li><p>You will be judged on how well you treat those who can do nothing for you.</p></li><li><p>We tend to overestimate what we can do in a day, and underestimate what we can achieve in a decade. Miraculous things can be accomplished if you give it ten years. A long game will compound small gains to overcome even big mistakes.</p></li><li><p>Thank a teacher who changed your life.</p></li><li><p>You cant reason someone out of a notion that they didn’t reason themselves into.</p></li><li><p>Your best job will be one that you were unqualified for because it stretches you. In fact only apply to jobs you are unqualified for.</p></li><li><p>Buy used books. They have the same words as the new ones. Also libraries.</p></li><li><p>You can be whatever you want, so be the person who ends meetings early.</p></li><li><p>A wise man said, “Before you speak, let your words pass through three gates. At the first gate, ask yourself, “Is it true?” At the second gate ask, “Is it necessary?” At the third gate ask, “Is it kind?”</p></li><li><p>Take the stairs.</p></li><li><p>What you actually pay for something is at least twice the listed price because of the energy, time, money needed to set it up, learn, maintain, repair, and dispose of at the end. Not all prices appear on labels. Actual costs are 2x listed prices.</p></li><li><p>When you arrive at your room in a hotel, locate the emergency exits. It only takes a minute.</p></li><li><p>The only productive way to answer “what should I do now?” is to first tackle the question of “who should I become?”</p></li><li><p>Average returns sustained over an above-average period of time yield extraordinary results. Buy and hold.</p></li><li><p>It’s thrilling to be extremely polite to rude strangers.</p></li><li><p>It’s possible that a not-so smart person, who can communicate well, can do much better than a super smart person who can’t communicate well. That is good news because it is much easier to improve your communication skills than your intelligence.</p></li><li><p>Getting cheated occasionally is the small price for trusting the best of everyone, because when you trust the best in others, they generally treat you best.</p></li><li><p>Art is whatever you can get away with.</p></li><li><p>For the best results with your children, spend only half the money you think you should, but double the time with them.</p></li><li><p>Purchase the most recent tourist guidebook to your home town or region. You’ll learn a lot by playing the tourist once a year.</p></li><li><p>Dont wait in line to eat something famous. It is rarely worth the wait.</p></li><li><p>To rapidly reveal the true character of a person you just met, move them onto an abysmally slow internet connection. Observe.</p></li><li><p>Prescription for popular success: do something strange. Make a habit of your weird.</p></li><li><p>Be a pro. Back up your back up. Have at least one physical backup and one backup in the cloud. Have more than one of each. How much would you pay to retrieve all your data, photos, notes, if you lost them? Backups are cheap compared to regrets.</p></li><li><p>Dont believe everything you think you believe.</p></li><li><p>To signal an emergency, use the rule of three; 3 shouts, 3 horn blasts, or 3 whistles.</p></li><li><p>At a restaurant do you order what you know is great, or do you try something new? Do you make what you know will sell or try something new? Do you keep dating new folks or try to commit to someone you already met? The optimal balance for exploring new things vs exploiting them once found is: 1/3. Spend 1/3 of your time on exploring and 2/3 time on deepening. It is harder to devote time to exploring as you age because it seems unproductive, but aim for 1/3.</p></li><li><p>Actual great opportunities do not have “Great Opportunities” in the subject line.</p></li><li><p>When introduced to someone make eye contact and count to 4. You’ll both remember each other.</p></li><li><p>Take note if you find yourself wondering “Where is my good knife? Or, where is my good pen?” That means you have bad ones. Get rid of those.</p></li><li><p>When you are stuck, explain your problem to others. Often simply laying out a problem will present a solution. Make “explaining the problem” part of your troubleshooting process.</p></li><li><p>When buying a garden hose, an extension cord, or a ladder, get one substantially longer than you think you need. It’ll be the right size.</p></li><li><p>Dont bother fighting the old; just build the new.</p></li><li><p>Your group can achieve great things way beyond your means simply by showing people that they are appreciated.</p></li><li><p>When someone tells you about the peak year of human history, the period of time when things were good before things went downhill, it will always be the years of when they were 10 years old — which is the peak of any human’s existence.</p></li><li><p>You are as big as the things that make you angry.</p></li><li><p>When speaking to an audience it’s better to fix your gaze on a few people than to “spray” your gaze across the room. Your eyes telegraph to others whether you really believe what you are saying.</p></li><li><p>Habit is far more dependable than inspiration. Make progress by making habits. Dont focus on getting into shape. Focus on becoming the kind of person who never misses a workout.</p></li><li><p>When negotiating, dont aim for a bigger piece of the pie; aim to create a bigger pie.</p></li><li><p>If you repeated what you did today 365 more times will you be where you want to be next year?</p></li><li><p>You see only 2% of another person, and they see only 2% of you. Attune yourselves to the hidden 98%.</p></li><li><p>Your time and space are limited. Remove, give away, throw out things in your life that dont spark joy any longer in order to make room for those that do.</p></li><li><p>Our descendants will achieve things that will amaze us, yet a portion of what they will create could have been made with today’s materials and tools if we had had the imagination. Think bigger.</p></li><li><p>For a great payoff be especially curious about the things you are not interested in.</p></li><li><p>Focus on directions rather than destinations. Who knows their destiny? But maintain the right direction and you’ll arrive at where you want to go.</p></li><li><p>Every breakthrough is at first laughable and ridiculous. In fact if it did not start out laughable and ridiculous, it is not a breakthrough.</p></li><li><p>If you loan someone $20 and you never see them again because they are avoiding paying you back, that makes it worth $20.</p></li><li><p>Copying others is a good way to start. Copying yourself is a disappointing way to end.</p></li><li><p>The best time to negotiate your salary for a new job is the moment AFTER they say they want you, and not before. Then it becomes a game of chicken for each side to name an amount first, but it is to your advantage to get them to give a number before you do.</p></li><li><p>Rather than steering your life to avoid surprises, aim directly for them.</p></li><li><p>Dont purchase extra insurance if you are renting a car with a credit card.</p></li><li><p>If your opinions on one subject can be predicted from your opinions on another, you may be in the grip of an ideology. When you truly think for yourself your conclusions will not be predictable.</p></li><li><p>Aim to die broke. Give to your beneficiaries before you die; it’s more fun and useful. Spend it all. Your last check should go to the funeral home and it should bounce.</p></li><li><p>The chief prevention against getting old is to remain astonished.</p></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;ul&gt;
&lt;li&gt;&lt;p&gt;About 99% of the time, the right time is right now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No one is as impressed with your possessions as you are.&lt;/p</summary>
      
    
    
    
    <category term="read" scheme="https://wukong1024.github.io/categories/read/"/>
    
    
    <category term="read" scheme="https://wukong1024.github.io/tags/read/"/>
    
    <category term="KK" scheme="https://wukong1024.github.io/tags/KK/"/>
    
  </entry>
  
  <entry>
    <title>Software</title>
    <link href="https://wukong1024.github.io/2022/01/07/Software/"/>
    <id>https://wukong1024.github.io/2022/01/07/Software/</id>
    <published>2022-01-07T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="unlock-windows-pc-fingerprint-scanner-android"><a href="#unlock-windows-pc-fingerprint-scanner-android" class="headerlink" title="unlock-windows-pc-fingerprint-scanner-android"></a>unlock-windows-pc-fingerprint-scanner-android</h3><p><a class="link"   href="https://www.xda-developers.com/unlock-windows-pc-fingerprint-scanner-android/" >unlock-windows-pc-fingerprint-scanner-android<i class="fas fa-external-link-alt"></i></a></p><p> Windows Fingerprint Credential module &amp; Remote Fingerprint Unlocker</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;unlock-windows-pc-fingerprint-scanner-android&quot;&gt;&lt;a href=&quot;#unlock-windows-pc-fingerprint-scanner-android&quot; class=&quot;headerlink&quot; title=&quot;un</summary>
      
    
    
    
    <category term="software" scheme="https://wukong1024.github.io/categories/software/"/>
    
    
    <category term="笔记" scheme="https://wukong1024.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="software" scheme="https://wukong1024.github.io/tags/software/"/>
    
  </entry>
  
  <entry>
    <title>Python</title>
    <link href="https://wukong1024.github.io/2021/10/01/Python/"/>
    <id>https://wukong1024.github.io/2021/10/01/Python/</id>
    <published>2021-10-01T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Python"><a href="#Python" class="headerlink" title="Python"></a>Python</h1><h2 id="环境管理"><a href="#环境管理" class="headerlink" title="环境管理"></a>环境管理</h2><p>uv</p><h2 id="Lib"><a href="#Lib" class="headerlink" title="Lib"></a>Lib</h2><h3 id="Django"><a href="#Django" class="headerlink" title="Django"></a>Django</h3><h3 id="django-ninja"><a href="#django-ninja" class="headerlink" title="django-ninja"></a>django-ninja</h3><p><a class="link"   href="https://github.com/vitalik/django-ninja" >https://github.com/vitalik/django-ninja<i class="fas fa-external-link-alt"></i></a></p><h3 id="django-ninja-crud"><a href="#django-ninja-crud" class="headerlink" title="django-ninja-crud"></a>django-ninja-crud</h3><p><a class="link"   href="https://github.com/hbakri/django-ninja-crud" >https://github.com/hbakri/django-ninja-crud<i class="fas fa-external-link-alt"></i></a></p><h3 id="爬虫"><a href="#爬虫" class="headerlink" title="爬虫"></a>爬虫</h3><p>helium</p><h3 id="Other"><a href="#Other" class="headerlink" title="Other"></a>Other</h3><h4 id="pyvis"><a href="#pyvis" class="headerlink" title="pyvis"></a>pyvis</h4><p>生成图数据库界面</p><p><a class="link"   href="https://github.com/WestHealth/pyvis" >https://github.com/WestHealth/pyvis<i class="fas fa-external-link-alt"></i></a></p><p><a class="link"   href="https://github.com/visjs/vis-network" >https://github.com/visjs/vis-network<i class="fas fa-external-link-alt"></i></a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;Python&quot;&gt;&lt;a href=&quot;#Python&quot; class=&quot;headerlink&quot; title=&quot;Python&quot;&gt;&lt;/a&gt;Python&lt;/h1&gt;&lt;h2 id=&quot;环境管理&quot;&gt;&lt;a href=&quot;#环境管理&quot; class=&quot;headerlink&quot; title=&quot;环</summary>
      
    
    
    
    <category term="code" scheme="https://wukong1024.github.io/categories/code/"/>
    
    
    <category term="python" scheme="https://wukong1024.github.io/tags/python/"/>
    
    <category term="code" scheme="https://wukong1024.github.io/tags/code/"/>
    
  </entry>
  
  <entry>
    <title>CSS</title>
    <link href="https://wukong1024.github.io/2021/06/06/CSS/"/>
    <id>https://wukong1024.github.io/2021/06/06/CSS/</id>
    <published>2021-06-06T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="grid-布局"><a href="#grid-布局" class="headerlink" title="grid 布局"></a>grid 布局</h3><p><a class="link"   href="https://ishadeed.com/article/css-grid-area/#header-layout" >https://ishadeed.com/article/css-grid-area/#header-layout<i class="fas fa-external-link-alt"></i></a></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="meta">&lt;!DOCTYPE <span class="meta-keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span></span></span><br><span class="line"><span class="tag">        <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span></span></span><br><span class="line"><span class="tag">        <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span></span></span><br><span class="line"><span class="tag">    &gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">style</span>&gt;</span><span class="css"></span></span><br><span class="line"><span class="css">    <span class="selector-class">.page</span> &#123;</span></span><br><span class="line"><span class="css">        <span class="attribute">display</span>: grid;</span></span><br><span class="line"><span class="css">        grid-template-<span class="attribute">columns</span>: <span class="number">200px</span> <span class="number">1</span>fr;</span></span><br><span class="line"><span class="css">        grid-template-areas:</span></span><br><span class="line"><span class="css">            <span class="string">&quot;header header&quot;</span></span></span><br><span class="line"><span class="css">            <span class="string">&quot;sidebar  main&quot;</span></span></span><br><span class="line"><span class="css">            <span class="string">&quot;footer footer&quot;</span>;</span></span><br><span class="line"><span class="css">        gap: <span class="number">1rem</span>;</span></span><br><span class="line"><span class="css">    &#125;</span></span><br><span class="line"><span class="css"></span></span><br><span class="line"><span class="css">    <span class="selector-class">.header</span> &#123;</span></span><br><span class="line"><span class="css">        grid-area: header;</span></span><br><span class="line"><span class="css">        <span class="attribute">height</span>: <span class="number">100px</span>;</span></span><br><span class="line"><span class="css">        <span class="attribute">background-color</span>: aqua;</span></span><br><span class="line"><span class="css">    &#125;</span></span><br><span class="line"><span class="css"></span></span><br><span class="line"><span class="css"></span></span><br><span class="line"><span class="css">    <span class="selector-class">.sidebar</span> &#123;</span></span><br><span class="line"><span class="css">        grid-area: sidebar;</span></span><br><span class="line"><span class="css">        <span class="attribute">min-height</span>: <span class="number">300px</span>;</span></span><br><span class="line"><span class="css">        <span class="attribute">background-color</span>: blueviolet;</span></span><br><span class="line"><span class="css">    &#125;</span></span><br><span class="line"><span class="css"></span></span><br><span class="line"><span class="css">    <span class="selector-class">.main</span> &#123;</span></span><br><span class="line"><span class="css">        grid-area: main;</span></span><br><span class="line"><span class="css">        <span class="attribute">min-height</span>: <span class="number">300px</span>;</span></span><br><span class="line"><span class="css">        <span class="attribute">background-color</span>: brown;</span></span><br><span class="line"><span class="css">    &#125;</span></span><br><span class="line"><span class="css"></span></span><br><span class="line"><span class="css">    <span class="selector-class">.footer</span> &#123;</span></span><br><span class="line"><span class="css">        grid-area: footer;</span></span><br><span class="line"><span class="css">        <span class="attribute">height</span>: <span class="number">100px</span>;</span></span><br><span class="line"><span class="css">        <span class="attribute">background-color</span>: chartreuse;</span></span><br><span class="line"><span class="css">    &#125;</span></span><br><span class="line"><span class="css"></span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;page&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;header&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;sidebar&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;main&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;footer&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;grid-布局&quot;&gt;&lt;a href=&quot;#grid-布局&quot; class=&quot;headerlink&quot; title=&quot;grid 布局&quot;&gt;&lt;/a&gt;grid 布局&lt;/h3&gt;&lt;p&gt;&lt;a class=&quot;link&quot;   href=&quot;https://ishadeed.com/artic</summary>
      
    
    
    
    <category term="frontend" scheme="https://wukong1024.github.io/categories/frontend/"/>
    
    
    <category term="frontend" scheme="https://wukong1024.github.io/tags/frontend/"/>
    
    <category term="css" scheme="https://wukong1024.github.io/tags/css/"/>
    
  </entry>
  
  <entry>
    <title>前端</title>
    <link href="https://wukong1024.github.io/2021/05/01/%E5%89%8D%E7%AB%AF/"/>
    <id>https://wukong1024.github.io/2021/05/01/%E5%89%8D%E7%AB%AF/</id>
    <published>2021-05-01T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="前端"><a href="#前端" class="headerlink" title="前端"></a>前端</h1><h3 id="图片懒加载"><a href="#图片懒加载" class="headerlink" title="图片懒加载"></a>图片懒加载</h3><p>IntersectionObserver API 监听元素是否到当前窗口的事件 <a class="link"   href="https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserverEntry/isIntersecting" >isIntersecting<i class="fas fa-external-link-alt"></i></a></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> observer = <span class="keyword">new</span> IntersectionObserver(<span class="function">(<span class="params">changes</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="comment">// changes: 目标元素集合</span></span><br><span class="line">  changes.forEach(<span class="function">(<span class="params">change</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="comment">// intersectionRatio</span></span><br><span class="line">    <span class="keyword">if</span> (change.isIntersecting) &#123;</span><br><span class="line">      <span class="keyword">const</span> img = change.target;</span><br><span class="line">      img.src = img.dataset.src;</span><br><span class="line">      observer.unobserve(img);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">observer.observe(img);</span><br></pre></td></tr></table></figure><p>或者直接用LazyLoading 属性，<code>&lt;img src=&quot;abc.jpg&quot; loading=&quot;lazy&quot; /&gt;</code>，目前兼容性较差。</p><h3 id="防抖与节流"><a href="#防抖与节流" class="headerlink" title="防抖与节流"></a>防抖与节流</h3><blockquote><p>clearTimeout(timer) 清除定时器，timer = null 修改timer的指向，不影响定时器</p></blockquote><h4 id="防抖-debounce"><a href="#防抖-debounce" class="headerlink" title="防抖(debounce)"></a>防抖(debounce)</h4><p>触发高频事件后n秒内函数只会执行一次（触发最后一次事件），如果n秒内高频事件再次被触发，则重新计算时间。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 防抖函数</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">debounce</span> (<span class="params">fn, wait</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">let</span> timer;</span><br><span class="line">    <span class="keyword">return</span> <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (timer) &#123; <span class="built_in">clearTimeout</span>(timer) &#125;</span><br><span class="line">        timer = <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            fn.apply(<span class="built_in">this</span>, <span class="built_in">arguments</span>)</span><br><span class="line">        &#125;, wait);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 高频事件停止触发后500ms 开始执行</span></span><br><span class="line"><span class="keyword">const</span> cld = debounce(<span class="built_in">console</span>.log, <span class="number">500</span>)</span><br><span class="line">cld(<span class="number">123</span>)</span><br><span class="line">cld(<span class="number">456</span>)</span><br></pre></td></tr></table></figure><h4 id="节流-throttle"><a href="#节流-throttle" class="headerlink" title="节流(throttle)"></a>节流(throttle)</h4><p>高频事件触发，但在n秒内只会执行一次，所以节流会稀释函数的执行频率</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">throttle</span> (<span class="params">fn, wait</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">let</span> timer;</span><br><span class="line">    <span class="keyword">return</span> <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (timer) <span class="keyword">return</span>;</span><br><span class="line">        timer = <span class="built_in">setTimeout</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">            timer = <span class="literal">null</span></span><br><span class="line">            fn.apply(<span class="built_in">this</span>, <span class="built_in">arguments</span>)</span><br><span class="line">        &#125;, wait);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 稀释，高频事件500ms执行一次</span></span><br><span class="line"><span class="keyword">const</span> clt = throttle(<span class="built_in">console</span>.log, <span class="number">1000</span>)</span><br><span class="line"><span class="built_in">setInterval</span>(<span class="function">() =&gt;</span> &#123;</span><br><span class="line">    clt(<span class="string">&#x27;123&#x27;</span>)</span><br><span class="line">&#125;, <span class="number">10</span>);</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="数组转树结构"><a href="#数组转树结构" class="headerlink" title="数组转树结构"></a>数组转树结构</h4><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">const</span> flatArr = [</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">&#x27;0111&#x27;</span>, <span class="attr">parentId</span>: <span class="string">&#x27;011&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;节点1-1-1&#x27;</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">&#x27;011&#x27;</span>, <span class="attr">parentId</span>: <span class="string">&#x27;01&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;节点1-1&#x27;</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">&#x27;01&#x27;</span>, <span class="attr">parentId</span>: <span class="number">0</span>, <span class="attr">name</span>: <span class="string">&#x27;节点1&#x27;</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">&#x27;02&#x27;</span>, <span class="attr">parentId</span>: <span class="number">0</span>, <span class="attr">name</span>: <span class="string">&#x27;节点2&#x27;</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">&#x27;022&#x27;</span>, <span class="attr">parentId</span>: <span class="string">&#x27;02&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;节点2-2&#x27;</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">&#x27;023&#x27;</span>, <span class="attr">parentId</span>: <span class="string">&#x27;02&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;节点2-3&#x27;</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">&#x27;0222&#x27;</span>, <span class="attr">parentId</span>: <span class="string">&#x27;022&#x27;</span>, <span class="attr">name</span>: <span class="string">&#x27;节点2-2-2&#x27;</span> &#125;,</span><br><span class="line">  &#123; <span class="attr">id</span>: <span class="string">&#x27;03&#x27;</span>, <span class="attr">parentId</span>: <span class="number">0</span>, <span class="attr">name</span>: <span class="string">&#x27;节点3&#x27;</span> &#125;,</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getData</span> (<span class="params">arr</span>) </span>&#123;</span><br><span class="line">  <span class="comment">// 利用两层filter实现</span></span><br><span class="line">  <span class="keyword">let</span> data = arr.filter(<span class="function"><span class="params">item</span> =&gt;</span> &#123;</span><br><span class="line">    item.children = arr.filter(<span class="function"><span class="params">e</span> =&gt;</span> &#123;</span><br><span class="line">      <span class="keyword">return</span> item.id === e.parentId</span><br><span class="line">    &#125;) || []</span><br><span class="line">    <span class="comment">// 第一层 筛选 parentId 为 0 </span></span><br><span class="line">    <span class="keyword">return</span> !item.parentId</span><br><span class="line">  &#125;)</span><br><span class="line">  <span class="keyword">return</span> data</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">const</span> res = getData(flatArr)</span><br><span class="line"><span class="built_in">console</span>.log(<span class="string">&#x27;res&#x27;</span>, res)</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="cookie"><a href="#cookie" class="headerlink" title="cookie"></a>cookie</h3><p>cookie 不同端口号共享，根据同源策略cookie是区分端口，对于浏览器cookie区分域名不区分端口，可以共享。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;前端&quot;&gt;&lt;a href=&quot;#前端&quot; class=&quot;headerlink&quot; title=&quot;前端&quot;&gt;&lt;/a&gt;前端&lt;/h1&gt;&lt;h3 id=&quot;图片懒加载&quot;&gt;&lt;a href=&quot;#图片懒加载&quot; class=&quot;headerlink&quot; title=&quot;图片懒加载&quot;&gt;&lt;/a&gt;图片懒加</summary>
      
    
    
    
    <category term="Code" scheme="https://wukong1024.github.io/categories/Code/"/>
    
    
    <category term="笔记" scheme="https://wukong1024.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="code" scheme="https://wukong1024.github.io/tags/code/"/>
    
  </entry>
  
  <entry>
    <title>KK_69</title>
    <link href="https://wukong1024.github.io/2021/04/19/KK_69/"/>
    <id>https://wukong1024.github.io/2021/04/19/KK_69/</id>
    <published>2021-04-19T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<ul><li><p>That thing that made you weird as a kid could make you great as an adult — if you don’t lose it.</p></li><li><p>If you have any doubt at all about being able to carry a load in one trip, do yourself a huge favor and make two trips.</p></li><li><p>What you get by achieving your goals is not as important as what you become by achieving your goals. At your funeral people will not recall what you did; they will only remember how you made them feel.</p></li><li><p>Recipe for success: under-promise and over-deliver.</p></li><li><p>It’s not an apology if it comes with an excuse. It is not a compliment if it comes with a request.</p></li><li><p>Jesus, Superman, and Mother Teresa never made art. Only imperfect beings can make art because art begins in what is broken.</p></li><li><p>If someone is trying to convince you it’s not a pyramid scheme, it’s a pyramid scheme.</p></li><li><p>Learn how to tie a bowline knot. Practice in the dark. With one hand. For the rest of your life you’ll use this knot more times than you would ever believe.</p></li><li><p>If something fails where you thought it would fail, that is not a failure.</p></li><li><p>Be governed not by the tyranny of the urgent but by the elevation of the important.</p></li><li><p>Leave a gate behind you the way you first found it.</p></li><li><p>The greatest rewards come from working on something that nobody has a name for. If you possibly can, work where there are no words for what you do.</p></li><li><p>A balcony or porch needs to be at least 6 feet (2m) deep or it won’t be used.</p></li><li><p>Don’t create things to make money; make money so you can create things. The reward for good work is more work.</p></li><li><p>In all things — except love — start with the exit strategy. Prepare for the ending. Almost anything is easier to get into than out of.</p></li><li><p>Train employees well enough they could get another job, but treat them well enough so they never want to.</p></li><li><p>Don’t aim to have others like you; aim to have them respect you.</p></li><li><p>The foundation of maturity: Just because it’s not your fault doesn’t mean it’s not your responsibility.</p></li><li><p>A multitude of bad ideas is necessary for one good idea.</p></li><li><p>Being wise means having more questions than answers.</p></li><li><p>Compliment people behind their back. It’ll come back to you.</p></li><li><p>Most overnight successes — in fact any significant successes — take at least 5 years. Budget your life accordingly.</p></li><li><p>You are only as young as the last time you changed your mind.</p></li><li><p>Assume anyone asking for your account information for any reason is guilty of scamming you, unless proven innocent. The way to prove innocence is to call them back, or login to your account using numbers or a website that you provide, not them. Don’t release any identifying information while they are contacting you via phone, message or email. You must control the channel.</p></li><li><p>Sustained outrage makes you stupid.</p></li><li><p>Be strict with yourself and forgiving of others. The reverse is hell for everyone.</p></li><li><p>Your best response to an insult is “You’re probably right.” Often they are.</p></li><li><p>The worst evils in history have always been committed by those who truly believed they were combating evil. Beware of combating evil.</p></li><li><p>If you can avoid seeking approval of others, your power is limitless.</p></li><li><p>When a child asks an endless string of “why?” questions, the smartest reply is, “I don’t know, what do you think?”</p></li><li><p>To be wealthy, accumulate all those things that money can’t buy.</p></li><li><p>Be the change you wish to see.</p></li><li><p>When brainstorming, improvising, jamming with others, you’ll go much further and deeper if you build upon each contribution with a playful “yes — and” example instead of a deflating “no — but” reply.</p></li><li><p>Work to become, not to acquire.</p></li><li><p>Don’t loan money to a friend unless you are ready to make it a gift.</p></li><li><p>On the way to a grand goal, celebrate the smallest victories as if each one were the final goal. No matter where it ends you are victorious.</p></li><li><p>Calm is contagious.</p></li><li><p>Even a foolish person can still be right about most things. Most conventional wisdom is true.</p></li><li><p>Always cut away from yourself.</p></li><li><p>Show me your calendar and I will tell you your priorities. Tell me who your friends are, and I’ll tell you where you’re going.</p></li><li><p>When hitchhiking, look like the person you want to pick you up.</p></li><li><p>Contemplating the weaknesses of others is easy; contemplating the weaknesses in yourself is hard, but it pays a much higher reward.</p></li><li><p>Worth repeating: measure twice, cut once.</p></li><li><p>Your passion in life should fit you exactly; but your purpose in life should exceed you. Work for something much larger than yourself.</p></li><li><p>If you can’t tell what you desperately need, it’s probably sleep.</p></li><li><p>When playing Monopoly, spend all you have to buy, barter, or trade for the Orange properties. Don’t bother with Utilities.</p></li><li><p>If you borrow something, try to return it in better shape than you received it. Clean it, sharpen it, fill it up.</p></li><li><p>Even in the tropics it gets colder at night than you think. Pack warmly.</p></li><li><p>To quiet a crowd or a drunk, just whisper.</p></li><li><p>Writing down one thing you are grateful for each day is the cheapest possible therapy ever.</p></li><li><p>When someone tells you something is wrong, they’re usually right. When someone tells you how to fix it, they’re usually wrong.</p></li><li><p>If you think you saw a mouse, you did. And, if there is one, there are more.</p></li><li><p>Money is overrated. Truly new things rarely need an abundance of money. If that was so, billionaires would have a monopoly on inventing new things, and they don’t. Instead almost all breakthroughs are made by those who lack money, because they are forced to rely on their passion, persistence and ingenuity to figure out new ways. Being poor is an advantage in innovation.</p></li><li><p>Ignore what others may be thinking of you, because they aren’t.</p></li><li><p>Avoid hitting the snooze button. That’s just training you to oversleep.</p></li><li><p>Always say less than necessary.</p></li><li><p>You are given the gift of life in order to discover what your gift <em>in</em> life is. You will complete your mission when you figure out what your mission is. This is not a paradox. This is the way.</p></li><li><p>Don’t treat people as bad as they are. Treat them as good as you are.</p></li><li><p>It is much easier to change how you think by changing your behavior, than it is to change your behavior by changing how you think. Act out the change you seek.</p></li><li><p>You can eat any dessert you want if you take only 3 bites.</p></li><li><p>Each time you reach out to people, bring them a blessing; then they’ll be happy to see you when you bring them a problem.</p></li><li><p>Bad things can happen fast, but almost all good things happen slowly.</p></li><li><p>Don’t worry how or where you begin. As long as you keep moving, your success will be far from where you start.</p></li><li><p>When you confront a stuck bolt or screw: righty tighty, lefty loosey.</p></li><li><p>If you meet a jerk, overlook them. If you meet jerks everywhere everyday, look deeper into yourself.</p></li><li><p>Dance with your hips.</p></li><li><p>We are not bodies that temporarily have souls. We are souls that temporarily have bodies.</p></li><li><p>You can reduce the annoyance of someone’s stupid belief by increasing your understanding of why they believe it.</p></li><li><p>If your goal does not have a schedule, it is a dream.</p></li><li><p>All the greatest gains in life — in wealth, relationships, or knowledge —come from the magic of compounding interest — amplifying small steady gains. All you need for abundance is to keep adding 1% more than you subtract on a regular basis.</p></li><li><p>The greatest breakthroughs are missed because they look like hard work.</p></li><li><p>People can’t remember more than 3 points from a speech.</p></li><li><p>I have never met a person I admired who did not read more books than I did.</p></li><li><p>The greatest teacher is called “doing”.</p></li><li><p>Finite games are played to win or lose. Infinite games are played to keep the game going. Seek out infinite games because they yield infinite rewards.</p></li><li><p>Everything is hard before it is easy. The day before something is a breakthrough, it’s a stupid idea.</p></li><li><p>A problem that can be solved with money is not really a problem.</p></li><li><p>When you are stuck, sleep on it. Let your subconscious work for you.</p></li><li><p>Your work will be endless, but your time is finite. You cannot limit the work so you must limit your time. Hours are the only thing you can manage.</p></li><li><p>To succeed, get other people to pay you; to become wealthy, help other people to succeed.</p></li><li><p>Children totally accept — and crave — family rules. “In our family we have a rule for X” is the only excuse a parent needs for setting a family policy. In fact, “I have a rule for X” is the only excuse you need for your own personal policies.</p></li><li><p>All guns are loaded.</p></li><li><p>Many backward steps are made by standing still.</p></li><li><p>This is the best time ever to make something. None of the greatest, coolest creations 20 years from now have been invented yet. You are not late.</p></li><li><p>No rain, no rainbow.</p></li><li><p>Every person you meet knows an amazing lot about something you know virtually nothing about. Your job is to discover what it is, and it won’t be obvious.</p></li><li><p>You don’t marry a person, you marry a family.</p></li><li><p>Always give credit, take blame.</p></li><li><p>Be frugal in all things, except in your passions splurge.</p></li><li><p>When making something, always get a few extras — extra material, extra parts, extra space, extra finishes. The extras serve as backups for mistakes, reduce stress, and fill your inventory for the future. They are the cheapest insurance.</p></li><li><p>Something does not need to be perfect to be wonderful. Especially weddings.</p></li><li><p>Don’t let your email inbox become your to-do list.</p></li><li><p>The best way to untangle a knotty tangle is not to “untie” the knots, but to keep pulling the loops apart wider and wider. Just make the mess as big, loose and open as possible. As you open up the knots they will unravel themselves. Works on cords, strings, hoses, yarns, or electronic cables.</p></li><li><p>Be a good ancestor. Do something a future generation will thank you for. A simple thing is to plant a tree.</p></li><li><p>To combat an adversary, become their friend.</p></li><li><p>Take one simple thing — almost anything — but take it extremely seriously, as if it was the only thing in the world, or maybe the entire world is in it — and by taking it seriously you’ll light up the sky.</p></li><li><p>History teaches us that in 100 years from now some of the assumptions you believed will turn out to be wrong. A good question to ask yourself today is “What might I be wrong about?”</p></li><li><p>Be nice to your children because they are going to choose your nursing home.</p></li><li><p>Advice like these are not laws. They are like hats. If one doesn’t fit, try another.</p></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;ul&gt;
&lt;li&gt;&lt;p&gt;That thing that made you weird as a kid could make you great as an adult — if you don’t lose it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have an</summary>
      
    
    
    
    <category term="read" scheme="https://wukong1024.github.io/categories/read/"/>
    
    
    <category term="read" scheme="https://wukong1024.github.io/tags/read/"/>
    
    <category term="KK" scheme="https://wukong1024.github.io/tags/KK/"/>
    
  </entry>
  
  <entry>
    <title>也谈人生-季承</title>
    <link href="https://wukong1024.github.io/2021/02/02/%E4%B9%9F%E8%B0%88%E4%BA%BA%E7%94%9F-%E5%AD%A3%E6%89%BF/"/>
    <id>https://wukong1024.github.io/2021/02/02/%E4%B9%9F%E8%B0%88%E4%BA%BA%E7%94%9F-%E5%AD%A3%E6%89%BF/</id>
    <published>2021-02-02T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="也谈人生-季承"><a href="#也谈人生-季承" class="headerlink" title="也谈人生-季承"></a>也谈人生-季承</h1><p>谈论人生者多矣。</p><p>然而究竟什么是人生？答案必定众说纷纭。以我之见，人生是人的生命的一个过程。有始有终，有头有尾，明确无误。对每个个人说来，人生只有一次，而且为时甚短。而对于人的集<br>合体的人类说来则不同，它也有生命，也是有始有终。不过，它的周期要长得多。至于人类的生命是否只有一次，现在还不好说。</p><p>人生有没有意义？人类又有什么意义？我说，人生是有意义的，而人类则是没有意义的。询问人类的存在有没有意义，就等于询问地球或宇宙的存在有没有意义一样，是得不到答案的。</p><p>人生的意义是什么呢？它的意义就在于为没有意义的人类工作、服务等等，其目的不外乎是使人类生活得更好并得以延续。我这样说，恐怕会遭到反对，可是你细想一下，或许就会同意我的这种说法。</p><p>人生既有这样的意义，我们就要把它过好。如何过好一生，道理多了去了。几千年的人类文明史中探讨出来的人生之道也多了去了。我觉得，不管道理有千条万条，人生的最大意义是在于劳作，也就是劳动、工作。因为，只有每个人都劳作，个人才能生存，血脉才能延续，社会也才能生存、延续。所以，一个人既然获得了生命，活在世上，就要劳作，就要辛勤劳作，使自己得以生存，使家庭得以繁衍，使社会得以昌盛，使国家得以富强，使世界得以发展，也就是使人类得以存在并很好地延续。</p><p>所以说，劳作的人生意义大矣！</p><p>至于说人类的存在是没有意义的，或许会有许多人不赞成这种说法。我们不必为此展开辩论，更不必给对方扣什么大帽子。因为有意义也好，没有意义也好，反正人类是现实的存在，你又是其中一员，你有义务使它发展延续。你只要这样做了，你的人生就具有了意义，或者说价值，并不一定要去理会人类存在的意义。如此而已。阿门</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;也谈人生-季承&quot;&gt;&lt;a href=&quot;#也谈人生-季承&quot; class=&quot;headerlink&quot; title=&quot;也谈人生-季承&quot;&gt;&lt;/a&gt;也谈人生-季承&lt;/h1&gt;&lt;p&gt;谈论人生者多矣。&lt;/p&gt;
&lt;p&gt;然而究竟什么是人生？答案必定众说纷纭。以我之见，人生是人的生命的一个</summary>
      
    
    
    
    <category term="read" scheme="https://wukong1024.github.io/categories/read/"/>
    
    
    <category term="read" scheme="https://wukong1024.github.io/tags/read/"/>
    
    <category term="笔记" scheme="https://wukong1024.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>KK_68</title>
    <link href="https://wukong1024.github.io/2021/01/01/KK_68/"/>
    <id>https://wukong1024.github.io/2021/01/01/KK_68/</id>
    <published>2021-01-01T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<ul><li><p>Learn how to learn from those you disagree with, or even offend you. See if you can find the truth in what they believe.</p></li><li><p>Being enthusiastic is worth 25 IQ points.</p></li><li><p>Always demand a deadline. A deadline weeds out the extraneous and the ordinary. It prevents you from trying to make it perfect, so you have to make it different. Different is better.</p></li><li><p>Don’t be afraid to ask a question that may sound stupid because 99% of the time everyone else is thinking of the same question and is too embarrassed to ask it.</p></li><li><p>Being able to listen well is a superpower. While listening to someone you love keep asking them “Is there more?”, until there is no more.</p></li><li><p>A worthy goal for a year is to learn enough about a subject so that you can’t believe how ignorant you were a year earlier.</p></li><li><p>Gratitude will unlock all other virtues and is something you can get better at.</p></li><li><p>Treating a person to a meal never fails, and is so easy to do. It’s powerful with old friends and a great way to make new friends.</p></li><li><p>Don’t trust all-purpose glue.</p></li><li><p>Reading to your children regularly will bond you together and kickstart their imaginations.</p></li><li><p>Never use a credit card for credit. The only kind of credit, or debt, that is acceptable is debt to acquire something whose exchange value is extremely likely to increase, like in a home. The exchange value of most things diminishes or vanishes the moment you purchase them. Don’t be in debt to losers.</p></li><li><p>Pros are just amateurs who know how to gracefully recover from their mistakes.</p></li><li><p>Extraordinary claims should require extraordinary evidence to be believed.</p></li><li><p>Don’t be the smartest person in the room. Hangout with, and learn from, people smarter than yourself. Even better, find smart people who will disagree with you.</p></li><li><p>Rule of 3 in conversation. To get to the real reason, ask a person to go deeper than what they just said. Then again, and once more. The third time’s answer is close to the truth.</p></li><li><p>Don’t be the best. Be the only.</p></li><li><p>Everyone is shy. Other people are waiting for you to introduce yourself to them, they are waiting for you to send them an email, they are waiting for you to ask them on a date. Go ahead.</p></li><li><p>Don’t take it personally when someone turns you down. Assume they are like you: busy, occupied, distracted. Try again later. It’s amazing how often a second try works.</p></li><li><p>The purpose of a habit is to remove that action from self-negotiation. You no longer expend energy deciding whether to do it. You just do it. Good habits can range from telling the truth, to flossing.</p></li><li><p>Promptness is a sign of respect.</p></li><li><p>When you are young spend at least 6 months to one year living as poor as you can, owning as little as you possibly can, eating beans and rice in a tiny room or tent, to experience what your “worst” lifestyle might be. That way any time you have to risk something in the future you won’t be afraid of the worst case scenario.</p></li><li><p>Trust me: There is no “them”.</p></li><li><p>The more you are interested in others, the more interesting they find you. To be interesting, be interested.</p></li><li><p>Optimize your generosity. No one on their deathbed has ever regretted giving too much away.</p></li><li><p>To make something good, just do it. To make something great, just re-do it, re-do it, re-do it. The secret to making fine things is in remaking them.</p></li><li><p>The Golden Rule will never fail you. It is the foundation of all other virtues.</p></li><li><p>If you are looking for something in your house, and you finally find it, when you’re done with it, don’t put it back where you found it. Put it back where you first looked for it.</p></li><li><p>Saving money and investing money are both good habits. Small amounts of money invested regularly for many decades without deliberation is one path to wealth.</p></li><li><p>To make mistakes is human. To own your mistakes is divine. Nothing elevates a person higher than quickly admitting and taking personal responsibility for the mistakes you make and then fixing them fairly. If you mess up, fess up. It’s astounding how powerful this ownership is.</p></li><li><p>Never get involved in a land war in Asia.</p></li><li><p>You can obsess about serving your customers/audience/clients, or you can obsess about beating the competition. Both work, but of the two, obsessing about your customers will take you further.</p></li><li><p>Show up. Keep showing up. Somebody successful said: 99% of success is just showing up.</p></li><li><p>Separate the processes of creation from improving. You can’t write and edit, or sculpt and polish, or make and analyze at the same time. If you do, the editor stops the creator. While you invent, don’t select. While you sketch, don’t inspect. While you write the first draft, don’t reflect. At the start, the creator mind must be unleashed from judgement.</p></li><li><p>If you are not falling down occasionally, you are just coasting.</p></li><li><p>Perhaps the most counter-intuitive truth of the universe is that the more you give to others, the more you’ll get. Understanding this is the beginning of wisdom.</p></li><li><p>Friends are better than money. Almost anything money can do, friends can do better. In so many ways a friend with a boat is better than owning a boat.</p></li><li><p>This is true: It’s hard to cheat an honest man.</p></li><li><p>When an object is lost, 95% of the time it is hiding within arm’s reach of where it was last seen. Search in all possible locations in that radius and you’ll find it.</p></li><li><p>You are what you do. Not what you say, not what you believe, not how you vote, but what you spend your time on.</p></li><li><p>If you lose or forget to bring a cable, adapter or charger, check with your hotel. Most hotels now have a drawer full of cables, adapters and chargers others have left behind, and probably have the one you are missing. You can often claim it after borrowing it.</p></li><li><p>Hatred is a curse that does not affect the hated. It only poisons the hater. Release a grudge as if it was a poison.</p></li><li><p>There is no limit on better. Talent is distributed unfairly, but there is no limit on how much we can improve what we start with.</p></li><li><p>Be prepared: When you are 90% done any large project (a house, a film, an event, an app) the rest of the myriad details will take a second 90% to complete.</p></li><li><p>When you die you take absolutely nothing with you except your reputation.</p></li><li><p>Before you are old, attend as many funerals as you can bear, and listen. Nobody talks about the departed’s achievements. The only thing people will remember is what kind of person you were while you were achieving.</p></li><li><p>For every dollar you spend purchasing something substantial, expect to pay a dollar in repairs, maintenance, or disposal by the end of its life.</p></li></ul><p>+Anything real begins with the fiction of what could be. Imagination is therefore the most potent force in the universe, and a skill you can get better at. It’s the one skill in life that benefits from ignoring what everyone else knows.</p><ul><li><p>When crisis and disaster strike, don’t waste them. No problems, no progress.</p></li><li><p>On vacation go to the most remote place on your itinerary first, bypassing the cities. You’ll maximize the shock of otherness in the remote, and then later you’ll welcome the familiar comforts of a city on the way back.</p></li><li><p>When you get an invitation to do something in the future, ask yourself: would you accept this if it was scheduled for tomorrow? Not too many promises will pass that immediacy filter.</p></li><li><p>Don’t say anything about someone in email you would not be comfortable saying to them directly, because eventually they will read it.</p></li><li><p>If you desperately need a job, you are just another problem for a boss; if you can solve many of the problems the boss has right now, you are hired. To be hired, think like your boss.</p></li><li><p>Art is in what you leave out.</p></li><li><p>Acquiring things will rarely bring you deep satisfaction. But acquiring experiences will.</p></li><li><p>Rule of 7 in research. You can find out anything if you are willing to go seven levels. If the first source you ask doesn’t know, ask them who you should ask next, and so on down the line. If you are willing to go to the 7th source, you’ll almost always get your answer.</p></li><li><p>How to apologize: Quickly, specifically, sincerely.</p></li><li><p>Don’t ever respond to a solicitation or a proposal on the phone. The urgency is a disguise.</p></li><li><p>When someone is nasty, rude, hateful, or mean with you, pretend they have a disease. That makes it easier to have empathy toward them which can soften the conflict.</p></li><li><p>Eliminating clutter makes room for your true treasures.</p></li><li><p>You really don’t want to be famous. Read the biography of any famous person.</p></li><li><p>Experience is overrated. When hiring, hire for aptitude, train for skills. Most really amazing or great things are done by people doing them for the first time.</p></li><li><p>A vacation + a disaster = an adventure.</p></li><li><p>Buying tools: Start by buying the absolute cheapest tools you can find. Upgrade the ones you use a lot. If you wind up using some tool for a job, buy the very best you can afford.</p></li><li><p>Learn how to take a 20-minute power nap without embarrassment.</p></li><li><p>Following your bliss is a recipe for paralysis if you don’t know what you are passionate about. A better motto for most youth is “master something, anything”. Through mastery of one thing, you can drift towards extensions of that mastery that bring you more joy, and eventually discover where your bliss is.</p></li><li><p>I’m positive that in 100 years much of what I take to be true today will be proved to be wrong, maybe even embarrassingly wrong, and I try really hard to identify what it is that I am wrong about today.</p></li><li><p>Over the long term, the future is decided by optimists. To be an optimist you don’t have to ignore all the many problems we create; you just have to imagine improving our capacity to solve problems.</p></li><li><p>The universe is conspiring behind your back to make you a success. This will be much easier to do if you embrace this pronoia.</p></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Learn how to learn from those you disagree with, or even offend you. See if you can find the truth in what they believe.&lt;/p&gt;
&lt;/l</summary>
      
    
    
    
    <category term="read" scheme="https://wukong1024.github.io/categories/read/"/>
    
    
    <category term="read" scheme="https://wukong1024.github.io/tags/read/"/>
    
    <category term="KK" scheme="https://wukong1024.github.io/tags/KK/"/>
    
  </entry>
  
  <entry>
    <title>当然我在胡扯</title>
    <link href="https://wukong1024.github.io/2020/12/30/%E5%BD%93%E7%84%B6%E6%88%91%E5%9C%A8%E8%83%A1%E6%89%AF/"/>
    <id>https://wukong1024.github.io/2020/12/30/%E5%BD%93%E7%84%B6%E6%88%91%E5%9C%A8%E8%83%A1%E6%89%AF/</id>
    <published>2020-12-30T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="当然我在胡扯"><a href="#当然我在胡扯" class="headerlink" title="当然我在胡扯"></a>当然我在胡扯</h1><blockquote><p>对爱情的渴望，对知识的追求，对人类苦难不可遏制的同情心，这三种纯洁而无比强烈的激情支配着我的一生。这三种激情，就像飓风一样，在深深的苦海上，肆意地把我吹来吹去，吹到濒临绝望的边缘。—-罗素《我为什么活着》</p></blockquote><h2 id="时间"><a href="#时间" class="headerlink" title="时间"></a>时间</h2><p>当我们提到时间的时，前提是尊重，尊重自己的时间，尊重别人的时间。光阴似箭、白驹过隙的话不必重复，更想谈的是如何做正确的时间，做正确的事。</p><p>聊一下”抖音“，著名的时间”杀手”，由无数个简短的视频组成，无聊，无趣。但同时不可否认它的价值，为小镇青年和父辈们，提供了一个看见这光怪陆离的世界的窗口、一个消磨时间的途径，某种意义上也算是为”国泰民安“中的”民安“做了贡献。只是和一百年前的英法商人行为类似，某种一意义上一样在麻痹世人。</p><p>聊一下”开会“，之前看了关于谷歌的一本书《重新定义公司》，与时间相关的是”守时“和”出席必要的会议“，”守时“不必要谈，谈一下”出席必要的会议“。每一个参会者都应该积极主动参与、会议前查阅关于此次会议的相关资料，会议中主动参与发出自己的声音，会议后明确自己下一步要做的事。出席必要的会议，节省你的时间，节省他人的时间。</p><p>正确时间，做正确的事。我们经常会主动或被动参与一些活动。会议，上课，团建，聚餐等无趣的活动。</p><ul><li>关于会议和上课，很多时候我们对部分会议和课程不感兴趣，对新事物新知识新思想有抵触心理，你可以选择尝试去了解，集百家之长，成一家之言，不断完善自我对这个世界的认知，通过别人的眼睛去看这个世界。或者直接离开会议或课堂，去做自己该做的事。</li><li>关于团建和聚餐，说实话，真心不喜欢，太浪费时间了。但为了团队氛围和凝聚力，不得已戴着“面具”去组织或参加，去刻意引导大家参与，刻意引出话题让大家讨论，“面具”戴久了，似乎也就麻木了，挺讨厌这样的。相对而言，我更愿意用这些时间去学习新的事物，做一些好玩的事，享受做饭的过程，享受一个吃饭时看美剧和纪录片的时间。</li></ul><h2 id="团队·个人·工作"><a href="#团队·个人·工作" class="headerlink" title="团队·个人·工作"></a>团队·个人·工作</h2><p>团队。前两天向盛和塾的一位老师关于“是否放弃部分人”、“团队与个人的成长“和”输入与输出“三个问题进行了咨询，学到了很多，本质还是自身能力和修为不足，还有部分自私心在作祟。但现在的我不想成为工具人、不想成为”佛“去普渡众生。我自身有很多工作要做，很多东西要学，想通过自己努力去不断提升，永远把昨天的自己当做 SB。可以团队不一样，即使再努力也无法让一些人去突破，去成长为团队真正的一部分，而不是可有可无，可随时被替代的一员。自身的努力对团队的意义并不大，反而容易成为团队的工具人。哀莫大于心死，望诸君共勉。</p><p>个人。马斯洛的需求层次理论，也就是那个经典的金字塔，从底到高，分别是生理、安全、社交、尊重、自我实现。后期又增加了一个超自我实现，大意是个人充分满足自我实现后短暂的”高峰体验“。刚开始看马斯洛心理学相关的书籍时还不理解，后来在读《游戏改变世界》时才真正理解，不过换了个名字”心流(flow)“，心流是一种在实现自我价值时的一种状态，一旦进入心流状态，无论时成功或失败，都无法让你满意，保持高度的专注去实现自我突破。如何诱发心流 ：有明确目标行为方式或有既定规则，随着时间的推移难度和技能水平也提高的挑战性活动。举例：俄罗斯方块：</p><ul><li>视觉上的，你看到一排又一排的方块“噗噗”地消失；</li><li>数量上的，屏幕上的分数不断上涨；</li><li>性质上的，你感受到了持续上升的挑战性。</li></ul><p>工作。陪伴你一生最长的是工作，工作时不开心，那活着多累呀。我们是幸运的，至少中国多数 90 后是幸运的，接受了九年义务教育，之后又有幸读高中、大学。成为了中国 10%的大学生，5%的本科生，所以我们有了选择的权力，选择自己喜欢的工作，选择热爱的事业。工作的本质是创造价值，去回报老师的教育、亲人的养育、社会的宽容、国家的保护，工作的意义是通过你实现个人成就，创造价值时，同时恰好让这个世界变得好一点。我们上学时有明确的目标，及时的分数反馈，和家人老师的奖励，有这么多条件去帮助自我成长。工作时，多数人只是为了每月的工资在做无聊的坚持，在否定自我和浪费时间中艰难地煎熬度过。我们需要找到创造幸福的方法、动力的源泉，实现持久的激励和幸福。吾心即宇宙，所有的力量源于内心，每天叫醒自己的事自己的梦想，疲累时让自己坚持的是对成功的渴望，迷茫时唤醒自己的是人生的终极目标。当然你们可以觉得这是在洗脑，如标题所写，当然我在胡扯。</p><p>沉浸在自我奖励的艰苦工作中：自我激励&gt;&gt;艰苦的工作&gt;&gt;内在奖励&gt;&gt;持久幸福</p><p>让现实更美好</p><ul><li><p>每一天都在渴望满意的工作</p></li><li><p>渴望体验成功，至少也是希望成功</p></li><li><p>渴望与社会建立联系</p></li><li><p>渴望过得有意义，渴望超越自身宏伟事业的一部分</p></li></ul><h2 id="改变世界"><a href="#改变世界" class="headerlink" title="改变世界"></a>改变世界</h2><p>那些疯狂到以为自己能够改变世界的人，才能真正改变世界。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;当然我在胡扯&quot;&gt;&lt;a href=&quot;#当然我在胡扯&quot; class=&quot;headerlink&quot; title=&quot;当然我在胡扯&quot;&gt;&lt;/a&gt;当然我在胡扯&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;对爱情的渴望，对知识的追求，对人类苦难不可遏制的同情心，这三种纯洁而无比强烈的激情</summary>
      
    
    
    
    <category term="read" scheme="https://wukong1024.github.io/categories/read/"/>
    
    
    <category term="read" scheme="https://wukong1024.github.io/tags/read/"/>
    
    <category term="随笔" scheme="https://wukong1024.github.io/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>Windows Terminal</title>
    <link href="https://wukong1024.github.io/2020/06/06/Windows%20Terminal/"/>
    <id>https://wukong1024.github.io/2020/06/06/Windows%20Terminal/</id>
    <published>2020-06-06T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Windows-Terminal"><a href="#Windows-Terminal" class="headerlink" title="Windows Terminal"></a>Windows Terminal</h1><h2 id="启动路径配置"><a href="#启动路径配置" class="headerlink" title="启动路径配置"></a>启动路径配置</h2><p>在 Microsoft Store 安装 Windows Terminal、ubantu<br>打开配置文件，将用不到的环境设置 “hidden: true”, 增加新的环境。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  <span class="attr">&quot;guid&quot;</span>: <span class="string">&quot;&#123;7882cb27-2b3b-4512-86ce-40b8bc6aff9c&#125;&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;hidden&quot;</span>: <span class="literal">false</span>,</span><br><span class="line">  <span class="attr">&quot;name&quot;</span>: <span class="string">&quot;unen.xyz&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;commandline&quot;</span>: <span class="string">&quot;ssh root@47.112.162.128&quot;</span>,</span><br><span class="line">  <span class="attr">&quot;icon&quot;</span>: <span class="string">&quot;C:\\icon\\ali.png&quot;</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="powershell-配置文件"><a href="#powershell-配置文件" class="headerlink" title="powershell 配置文件"></a>powershell 配置文件</h2><p>powershell 配置文件 <a class="link"   href="https://forsenergy.com/zh-cn/windowspowershellhelp/html/9c82251c-6f0d-416a-9c3c-77838218531b.htm" >参考<i class="fas fa-external-link-alt"></i></a></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 显示路径</span></span><br><span class="line"><span class="meta">$</span><span class="bash">profile</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> 判断是否存在配置文件 若不存在手动创建</span></span><br><span class="line">test-path $profile</span><br></pre></td></tr></table></figure><h3 id="python-wokon"><a href="#python-wokon" class="headerlink" title="python wokon"></a>python wokon</h3><p>启动 python 虚拟环境 <a class="link"   href="http://hk.uwenku.com/question/p-dnkemkwb-ew.html" >参考<i class="fas fa-external-link-alt"></i></a></p><p>workon 是批處理腳本。如果你從 PowerShell 運行它，它會在一個新的 CMD 子進程中啓動，在那裏做它的事情，然後退出並返回到 PowerShell 提示符。由於子進程無法修改其父進程，所以當您返回到 PowerShell 時，將丟失 workon.bat 所做的所有修改。</p><p>写入 Microsoft. PowerShell_profile.ps1</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">workon</span><span class="params">(<span class="variable">$environment</span>)</span></span> &#123;</span><br><span class="line">    &amp; cmd /k workon.bat <span class="variable">$environment</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="免密登录-ssh"><a href="#免密登录-ssh" class="headerlink" title="免密登录 ssh"></a>免密登录 ssh</h2><p>服务器、主机分别生成公钥、私钥对 <code>ssh-keygen</code><br>将主机的公钥 <code>id_rsa.pub</code> 发送到服务器，<br>在服务器 <code>.ssh/</code> 文件夹下执行</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">touch authorized_keys</span><br><span class="line">chmod <span class="number">600</span> authorized_keys</span><br><span class="line"><span class="built_in">cat</span> id_rsa.pub &gt;&gt; authorized_keys</span><br></pre></td></tr></table></figure><p>测试是否实现免密登录 <code>ssh root@xx.xxx.xxx.xxx</code></p><h2 id="树莓派"><a href="#树莓派" class="headerlink" title="树莓派"></a>树莓派</h2><p>开启 frp 参考<a class="link"   href="https://www.jianshu.com/p/00c79df1aaf0" >教程<i class="fas fa-external-link-alt"></i></a><br>启动命令 <code>./frpc -c ./frpc.ini</code><br>宝塔<a class="link"   href="https://www.bilibili.com/video/BV1kE411C7hz" >教程<i class="fas fa-external-link-alt"></i></a><br>开启宝塔 <code>sudo ./bt_run</code> 关闭宝塔 <code>./bt_prog kill</code> 端口:28888<br>开启 samba<a class="link"   href="https://tlanyan.me/setup-samba-in-raspberry-pi/" >教程<i class="fas fa-external-link-alt"></i></a><br>挂载 U 盘<a class="link"   href="https://zhuanlan.zhihu.com/p/35061575" >教程<i class="fas fa-external-link-alt"></i></a><br>有线替换 Wifi <code>取消路由器中PI ip和MAC的绑定、路由器禁用PI wifi、重启路由器有线连接PI、手动绑定ip和MAC</code><br>关闭灯、wifi<a class="link"   href="https://zhuanlan.zhihu.com/p/138038622" >link<i class="fas fa-external-link-alt"></i></a></p><h3 id="默认管理员模式启动"><a href="#默认管理员模式启动" class="headerlink" title="默认管理员模式启动"></a>默认管理员模式启动</h3><p>新建快捷方式：目标改为 C:\Windows\System32\cmd.exe /c start /b wt<br>修改备注和图标后 加入 path 设为 t</p>]]></content>
    
    
    <summary type="html">Win10优化设置</summary>
    
    
    
    <category term="windows" scheme="https://wukong1024.github.io/categories/windows/"/>
    
    
    <category term="learn" scheme="https://wukong1024.github.io/tags/learn/"/>
    
    <category term="note" scheme="https://wukong1024.github.io/tags/note/"/>
    
  </entry>
  
  <entry>
    <title>游戏改变世界</title>
    <link href="https://wukong1024.github.io/2020/05/21/%E6%B8%B8%E6%88%8F%E6%94%B9%E5%8F%98%E4%B8%96%E7%95%8C/"/>
    <id>https://wukong1024.github.io/2020/05/21/%E6%B8%B8%E6%88%8F%E6%94%B9%E5%8F%98%E4%B8%96%E7%95%8C/</id>
    <published>2020-05-21T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="游戏改变世界"><a href="#游戏改变世界" class="headerlink" title="游戏改变世界"></a>游戏改变世界</h1><p>启示<br>及时反馈<br>不可预测<br>强社交性<br>一个成功的游戏就应该是有着文化内涵的，让人在游戏之外还能去讨论它。</p><p>现实已经破碎，我们需要用创造游戏来修复它。</p><p>协作的机制从强制变成自由<br>劳动的动机从自制变成游戏</p><p>我们真正害怕的不是游戏，而是在游戏结束、现实开始时迷失了方向。</p><p>抛开类型的差异和复杂的技术，所有的游戏都有 4 个决定性特征：目标、规则、反馈系统和自愿参与。<br>目标（goal），指的是玩家努力达成的具体结果。它吸引了玩家的注意力，不断调整他们的参与度。目标为玩家提供了“目的性”（sense of purpose）。<br>规则（rules），为玩家如何实现目标做出限制。它消除或限制了达成目标最明显的方式，推动玩家去探索此前未知的可能空间。规则可以释放玩家的创造力，培养玩家的策略性思维。<br>反馈系统（feedback system），告诉玩家距离实现目标还有多远。它通过点数、级别、得分、进度条等形式来反映。反馈系统最基本也最简单的形式，就是让玩家认识到一个客观结果：“等……的时候，游戏就结束了。”对玩家而言，实时反馈是一种承诺：目标绝对是可以达到的，它给了人们继续玩下去的动力。<br>自愿参与（voluntary participation），要求所有玩游戏的人都了解并愿意接受目标、规则和反馈。了解是建立多人游戏的共同基础。任意参与和离去的自由，则是为了保证玩家把游戏中蓄意设计的高压挑战工作视为安全且愉快的活动。</p><p>目标指的是玩家努力达成的具体结果；规则为玩家如何实现目标做出限制；反馈系统告诉玩家距离实现目标还有多远；自愿参与则要求所有玩家都了解并愿意接受目标、规则和反馈。</p><p>俄罗斯方块堆叠起来，就能得到三种反馈：</p><ul><li>一是视觉上的，你看到一排又一排的方块“噗噗”地消失；</li><li>二是数量上的，屏幕上的分数不断上涨；</li><li>三是性质上的，你感受到了持续上升的挑战性。</li></ul><p>心流(flow)：一旦进入心流状态，人们就像长久地停在那里，不管是放弃还是获胜，两种结果都同样无法让你心满意足。</p><p>有尽头的游戏：为了获胜而玩<br>无尽头的游戏：为了尽量长时间玩而玩</p><p>所有优秀的游戏都是艰苦的工作，是我们主动选择并乐在其中的工作。<br>创造性的成就和能力的提高带来的满足感和愉快感</p><p>游戏的七大艰苦之乐<br>高风险工作<br>重复工作<br>脑力工作<br>体力工作<br>探索性工作<br>团队工作<br>创造性工作</p><p>诱发心流  ：有明确目标行为方式或有既定规则，随着时间的推移难度和技能水平也提高的挑战性活动</p><p>创造幸福的力量<br>追求外在的奖励（金钱、物质、地位、赞许），注定会妨碍我们达成自身的幸福。<br>沉浸在自我奖励的艰苦工作中：自我激励&gt;&gt;艰苦的工作&gt;&gt;内在奖励&gt;&gt;持久幸福</p><p>让现实更美好<br>每一天都在渴望满意的工作<br>渴望体验成功，至少也是希望成功<br>渴望与社会建立联系<br>渴望过得有意义，渴望超越自身宏伟事业的一部分</p><p>我们真正需要的，是游戏能够超越让人短暂幸福的心流和自豪，提供一种更为持久的情感奖励；我们真正需要的，是哪怕不玩的时候仍能让我们幸福的游戏。只有这样，才能在游戏和现实生活中实现恰当的平衡。</p><p>成功的希望比成功本身更刺激</p><p>胜利往往终结乐趣，但失败能维持乐趣</p><p>向死而生，创伤后的幸福感</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;游戏改变世界&quot;&gt;&lt;a href=&quot;#游戏改变世界&quot; class=&quot;headerlink&quot; title=&quot;游戏改变世界&quot;&gt;&lt;/a&gt;游戏改变世界&lt;/h1&gt;&lt;p&gt;启示&lt;br&gt;及时反馈&lt;br&gt;不可预测&lt;br&gt;强社交性&lt;br&gt;一个成功的游戏就应该是有着文化内涵的，让人在游戏</summary>
      
    
    
    
    <category term="read" scheme="https://wukong1024.github.io/categories/read/"/>
    
    
    <category term="read" scheme="https://wukong1024.github.io/tags/read/"/>
    
    <category term="笔记" scheme="https://wukong1024.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Vue手册</title>
    <link href="https://wukong1024.github.io/2020/03/10/Vue%E6%89%8B%E5%86%8C/"/>
    <id>https://wukong1024.github.io/2020/03/10/Vue%E6%89%8B%E5%86%8C/</id>
    <published>2020-03-10T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Vue手册"><a href="#Vue手册" class="headerlink" title="Vue手册"></a>Vue手册</h1><p>[TOC]</p><h2 id="Vue实例"><a href="#Vue实例" class="headerlink" title="Vue实例"></a>Vue实例</h2><h3 id="关联数据和DOM"><a href="#关联数据和DOM" class="headerlink" title="关联数据和DOM"></a>关联数据和DOM</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;app&quot;</span>&gt;</span></span><br><span class="line">    &#123;&#123; message &#125;&#125;</span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> app = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#app&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">message</span>: <span class="string">&#x27;Hello Vue!&#x27;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="渲染绑定元素"><a href="#渲染绑定元素" class="headerlink" title="渲染绑定元素"></a>渲染绑定元素</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;app-2&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">span</span> <span class="attr">v-bind:title</span>=<span class="string">&quot;message&quot;</span>&gt;</span></span><br><span class="line">        鼠标悬停几秒钟查看此处动态绑定的提示信息！</span><br><span class="line">    <span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">var</span> app2 = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">            <span class="attr">el</span>: <span class="string">&#x27;#app-2&#x27;</span>,</span><br><span class="line">            <span class="attr">data</span>: &#123;</span><br><span class="line">                <span class="attr">message</span>: <span class="string">&#x27;页面加载于 &#x27;</span> + <span class="keyword">new</span> <span class="built_in">Date</span>().toLocaleString()</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br></pre></td></tr></table></figure><h3 id="if条件"><a href="#if条件" class="headerlink" title="if条件"></a>if条件</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;app-3&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span> <span class="attr">v-if</span>=<span class="string">&quot;seen&quot;</span>&gt;</span>现在你看到我了<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">var</span> app3 = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#app-3&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">seen</span>: <span class="literal">true</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="for循环"><a href="#for循环" class="headerlink" title="for循环"></a>for循环</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;app-4&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">ol</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">li</span> <span class="attr">v-for</span>=<span class="string">&quot;todo in todos&quot;</span>&gt;</span></span><br><span class="line">            &#123;&#123; todo.text &#125;&#125;</span><br><span class="line">        <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">ol</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">var</span> app4 = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#app-4&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">todos</span>: [&#123;</span><br><span class="line">                <span class="attr">text</span>: <span class="string">&#x27;学习 JavaScript&#x27;</span></span><br><span class="line">            &#125;,</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="attr">text</span>: <span class="string">&#x27;学习 Vue&#x27;</span></span><br><span class="line">            &#125;,</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="attr">text</span>: <span class="string">&#x27;整个牛项目&#x27;</span></span><br><span class="line">            &#125;</span><br><span class="line">        ]</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="v-on事件监听"><a href="#v-on事件监听" class="headerlink" title="v-on事件监听"></a>v-on事件监听</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;app-5&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;&#123; message &#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">v-on:click</span>=<span class="string">&quot;reverseMessage&quot;</span>&gt;</span>反转消息<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">var</span> app5 = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#app-5&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">message</span>: <span class="string">&#x27;Hello Vue.js!&#x27;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">methods</span>: &#123;</span><br><span class="line">        <span class="attr">reverseMessage</span>: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">            <span class="built_in">this</span>.message = <span class="built_in">this</span>.message.split(<span class="string">&#x27;&#x27;</span>).reverse().join(<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="v-model双向绑定"><a href="#v-model双向绑定" class="headerlink" title="v-model双向绑定"></a>v-model双向绑定</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;app-6&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;&#123; message &#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">v-model</span>=<span class="string">&quot;message&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">var</span> app6 = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#app-6&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">message</span>: <span class="string">&#x27;Hello Vue!&#x27;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="freeze冻结-阻止修改"><a href="#freeze冻结-阻止修改" class="headerlink" title="freeze冻结 阻止修改"></a>freeze冻结 阻止修改</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;app&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>&#123;&#123; foo &#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- 这里的 `foo` 不会更新！ --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">v-on:click</span>=<span class="string">&quot;foo = &#x27;baz&#x27;&quot;</span>&gt;</span>Change it<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">var</span> obj = &#123;</span><br><span class="line">    <span class="attr">foo</span>: <span class="string">&#x27;bar&#x27;</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="built_in">Object</span>.freeze(obj)</span><br><span class="line"></span><br><span class="line"><span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#app&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: obj</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="vue生命周期"><a href="#vue生命周期" class="headerlink" title="vue生命周期"></a>vue生命周期</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">a</span>: <span class="number">1</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">created</span>: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="comment">// `this` 指向 vm 实例</span></span><br><span class="line">        <span class="built_in">console</span>.log(<span class="string">&#x27;a is: &#x27;</span> + <span class="built_in">this</span>.a)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br><span class="line"><span class="comment">// =&gt; &quot;a is: 1&quot;</span></span><br></pre></td></tr></table></figure><p><img                       lazyload                     alt="image"                     data-src="https://cn.vuejs.org/images/lifecycle.png"                      alt="vue生命周期"                ></p><h2 id="模板语法"><a href="#模板语法" class="headerlink" title="模板语法"></a>模板语法</h2><h3 id="文本"><a href="#文本" class="headerlink" title="文本"></a>文本</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!--  v-once当数据改变时，插值处的内容不会更新 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">span</span> <span class="attr">v-once</span>&gt;</span>这个将不会改变: &#123;&#123; msg &#125;&#125;<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="原始-HTML"><a href="#原始-HTML" class="headerlink" title="原始 HTML"></a>原始 HTML</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 容易导致 XSS 攻击 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span>Using mustaches: &#123;&#123; rawHtml &#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span>&gt;</span>Using v-html directive: <span class="tag">&lt;<span class="name">span</span> <span class="attr">v-html</span>=<span class="string">&quot;rawHtml&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="Attribute"><a href="#Attribute" class="headerlink" title="Attribute"></a>Attribute</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-bind:id</span>=<span class="string">&quot;dynamicId&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!--  null、undefined 、false --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">button</span> <span class="attr">v-bind:disabled</span>=<span class="string">&quot;isButtonDisabled&quot;</span>&gt;</span>Button<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="使用-JavaScript-表达式"><a href="#使用-JavaScript-表达式" class="headerlink" title="使用 JavaScript 表达式"></a>使用 JavaScript 表达式</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 数据作用域下作为 JavaScript 被解析，只能单个表达式 --&gt;</span></span><br><span class="line">&#123;&#123; number + 1 &#125;&#125;</span><br><span class="line"></span><br><span class="line">&#123;&#123; ok ? &#x27;YES&#x27; : &#x27;NO&#x27; &#125;&#125;</span><br><span class="line"></span><br><span class="line">&#123;&#123; message.split(&#x27;&#x27;).reverse().join(&#x27;&#x27;) &#125;&#125;</span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-bind:id</span>=<span class="string">&quot;&#x27;list-&#x27; + id&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>只能访问全局变量白名单，不能访问用户自定义全局变量</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (process.env.NODE_ENV !== <span class="string">&#x27;production&#x27;</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> allowedGlobals = makeMap(</span><br><span class="line">        <span class="string">&#x27;Infinity,undefined,NaN,isFinite,isNaN,&#x27;</span></span><br><span class="line">        <span class="string">&#x27;parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,&#x27;</span></span><br><span class="line">        <span class="string">&#x27;Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,&#x27;</span></span><br><span class="line">        <span class="string">&#x27;require&#x27;</span> <span class="comment">// for Webpack/Browserify</span></span><br><span class="line">    )</span><br></pre></td></tr></table></figure><h3 id="参数"><a href="#参数" class="headerlink" title="参数"></a>参数</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- v-bind 响应式更新HTML attribute --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">v-bind:href</span>=<span class="string">&quot;url&quot;</span>&gt;</span>...<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- v-on 监听DOM事件 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">v-on:click</span>=<span class="string">&quot;doSomething&quot;</span>&gt;</span>...<span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="动态参数"><a href="#动态参数" class="headerlink" title="动态参数"></a>动态参数</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">v-bind:</span>[<span class="attr">attributeName</span>]=<span class="string">&quot;url&quot;</span>&gt;</span> ... <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 避免使用大写字符来命名键名，因为浏览器会把 attribute 名全部强制转为小写 --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- eventName 改为 eventname --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">v-on:</span>[<span class="attr">eventName</span>]=<span class="string">&quot;doSomething&quot;</span>&gt;</span> ... <span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="修饰符"><a href="#修饰符" class="headerlink" title="修饰符"></a>修饰符</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 指明的特殊后缀 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">form</span> <span class="attr">v-on:submit.prevent</span>=<span class="string">&quot;onSubmit&quot;</span>&gt;</span>...<span class="tag">&lt;/<span class="name">form</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="计算属性和侦听器"><a href="#计算属性和侦听器" class="headerlink" title="计算属性和侦听器"></a>计算属性和侦听器</h2><h3 id="computed-计算"><a href="#computed-计算" class="headerlink" title="computed 计算"></a>computed 计算</h3><p>计算属性具有缓存, 用于获取返回值</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;example&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>Original message: &quot;&#123;&#123; message &#125;&#125;&quot;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">v-model</span>=<span class="string">&quot;message&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>Computed reversed message: &quot;&#123;&#123; reversedMessage &#125;&#125;&quot;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">var</span> vm = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#example&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">message</span>: <span class="string">&#x27;Hello&#x27;</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">computed</span>: &#123;</span><br><span class="line">        <span class="comment">// 计算属性的 getter</span></span><br><span class="line">        <span class="attr">reversedMessage</span>: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">            <span class="comment">// `this` 指向 vm 实例</span></span><br><span class="line">            <span class="keyword">return</span> <span class="built_in">this</span>.message.split(<span class="string">&#x27;&#x27;</span>).reverse().join(<span class="string">&#x27;&#x27;</span>)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="watch-侦听"><a href="#watch-侦听" class="headerlink" title="watch 侦听"></a>watch 侦听</h3><p>监听特定值得前后变化, 用于执行</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="attr">watch</span>: &#123;</span><br><span class="line">    <span class="attr">status</span>: <span class="function"><span class="keyword">function</span>(<span class="params">value, oldValue</span>) </span>&#123;</span><br><span class="line">        <span class="built_in">this</span>.status = value</span><br><span class="line">        <span class="built_in">this</span>.page = <span class="number">1</span></span><br><span class="line">        <span class="built_in">this</span>.getData(<span class="number">1</span>)</span><br><span class="line">    &#125;,</span><br><span class="line">&#125;,</span><br></pre></td></tr></table></figure><h2 id="Class-与-Style-绑定"><a href="#Class-与-Style-绑定" class="headerlink" title="Class 与 Style 绑定"></a>Class 与 Style 绑定</h2><h3 id="class对象语法"><a href="#class对象语法" class="headerlink" title="class对象语法"></a>class对象语法</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;static&quot;</span> <span class="attr">v-bind:class</span>=<span class="string">&quot;&#123; active: isActive, &#x27;text-danger&#x27;: hasError &#125;&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="attr">data</span>: &#123;</span><br><span class="line">    <span class="attr">isActive</span>: <span class="literal">true</span>,</span><br><span class="line">    <span class="attr">hasError</span>: <span class="literal">false</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="style内联样式"><a href="#style内联样式" class="headerlink" title="style内联样式"></a>style内联样式</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-bind:style</span>=<span class="string">&quot;styleObject&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-bind:style</span>=<span class="string">&quot;[baseStyles, overridingStyles]&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">data: &#123;</span><br><span class="line">    <span class="attr">styleObject</span>: &#123;</span><br><span class="line">        <span class="attr">color</span>: <span class="string">&#x27;red&#x27;</span>,</span><br><span class="line">        <span class="attr">fontSize</span>: <span class="string">&#x27;13px&#x27;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="条件渲染"><a href="#条件渲染" class="headerlink" title="条件渲染"></a>条件渲染</h2><h3 id="v-if"><a href="#v-if" class="headerlink" title="v-if"></a>v-if</h3><p>v-else-if</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-if</span>=<span class="string">&quot;type === &#x27;A&#x27;&quot;</span>&gt;</span></span><br><span class="line">    A</span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-else-if</span>=<span class="string">&quot;type === &#x27;B&#x27;&quot;</span>&gt;</span></span><br><span class="line">    B</span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-else-if</span>=<span class="string">&quot;type === &#x27;C&#x27;&quot;</span>&gt;</span></span><br><span class="line">    C</span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-else</span>&gt;</span></span><br><span class="line">    Not A/B/C</span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>独立，不复用</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">template</span> <span class="attr">v-if</span>=<span class="string">&quot;loginType === &#x27;username&#x27;&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">label</span>&gt;</span>Username<span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">placeholder</span>=<span class="string">&quot;Enter your username&quot;</span> <span class="attr">key</span>=<span class="string">&quot;username-input&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">template</span> <span class="attr">v-else</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">label</span>&gt;</span>Email<span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">placeholder</span>=<span class="string">&quot;Enter your email address&quot;</span> <span class="attr">key</span>=<span class="string">&quot;email-input&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">template</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="v-for"><a href="#v-for" class="headerlink" title="v-for"></a>v-for</h3><p>数组</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">ul</span> <span class="attr">id</span>=<span class="string">&quot;example-2&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">v-for</span>=<span class="string">&quot;(item, index) in items&quot;</span>&gt;</span></span><br><span class="line">        &#123;&#123; parentMessage &#125;&#125; - &#123;&#123; index &#125;&#125; - &#123;&#123; item.message &#125;&#125;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">var</span> example2 = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#example-2&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">parentMessage</span>: <span class="string">&#x27;Parent&#x27;</span>,</span><br><span class="line">        <span class="attr">items</span>: [&#123;</span><br><span class="line">                <span class="attr">message</span>: <span class="string">&#x27;Foo&#x27;</span></span><br><span class="line">            &#125;,</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="attr">message</span>: <span class="string">&#x27;Bar&#x27;</span></span><br><span class="line">            &#125;</span><br><span class="line">        ]</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>对象</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">ul</span> <span class="attr">id</span>=<span class="string">&quot;v-for-object&quot;</span> <span class="attr">class</span>=<span class="string">&quot;demo&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span> <span class="attr">v-for</span>=<span class="string">&quot;(value, name,index) in object&quot;</span>&gt;</span></span><br><span class="line">        &#123;&#123;index&#125;&#125;.&#123;&#123; name &#125;&#125;: &#123;&#123; value &#125;&#125;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#v-for-object&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">object</span>: &#123;</span><br><span class="line">            <span class="attr">title</span>: <span class="string">&#x27;How to do lists in Vue&#x27;</span>,</span><br><span class="line">            <span class="attr">author</span>: <span class="string">&#x27;Jane Doe&#x27;</span>,</span><br><span class="line">            <span class="attr">publishedAt</span>: <span class="string">&#x27;2016-04-10&#x27;</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h4 id="数组更新检测"><a href="#数组更新检测" class="headerlink" title="数组更新检测"></a>数组更新检测</h4><p>变异方法</p><ul><li>push()向数组的末尾添加一个或多个元素，并返回新的长度</li><li>pop()删除并返回数组的最后一个元素。</li><li>shift()把数组的第一个元素从其中删除，并返回第一个元素的值</li><li>unshift()向数组的开头添加一个或更多元素，并返回新的长度。</li><li>splice()向/从数组中添加/删除项目，然后返回被删除的项目</li><li>sort()对数组的元素进行排序。</li><li>reverse()颠倒数组中元素的顺序。</li></ul><p>替换数组</p><ul><li>filter() 创建一个新的数组，新数组中的元素是通过检查指定数组中符合条件的所有元素。</li><li>concat() 用于连接两个或多个数组。</li><li>slice() 可从已有的数组中返回选定的元素。</li></ul><h2 id="事件处理"><a href="#事件处理" class="headerlink" title="事件处理"></a>事件处理</h2><h3 id="监听事件"><a href="#监听事件" class="headerlink" title="监听事件"></a>监听事件</h3><p>v-on 监听DOM事件，运行js代码</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;example-1&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">v-on:click</span>=<span class="string">&quot;counter += 1&quot;</span>&gt;</span>Add 1<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span>The button above has been clicked &#123;&#123; counter &#125;&#125; times.<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">var</span> example1 = <span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#example-1&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">counter</span>: <span class="number">0</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="事件处理方法"><a href="#事件处理方法" class="headerlink" title="事件处理方法"></a>事件处理方法</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;example-3&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">v-on:click</span>=<span class="string">&quot;say(&#x27;hi&#x27;)&quot;</span>&gt;</span>Say hi<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button</span> <span class="attr">v-on:click</span>=<span class="string">&quot;say(&#x27;what&#x27;)&quot;</span>&gt;</span>Say what<span class="tag">&lt;/<span class="name">button</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#example-3&#x27;</span>,</span><br><span class="line">    <span class="attr">methods</span>: &#123;</span><br><span class="line">        <span class="attr">say</span>: <span class="function"><span class="keyword">function</span>(<span class="params">message</span>) </span>&#123;</span><br><span class="line">            alert(message)</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="事件修饰符"><a href="#事件修饰符" class="headerlink" title="事件修饰符"></a>事件修饰符</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 阻止单击事件继续传播 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">v-on:click.stop</span>=<span class="string">&quot;doThis&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 提交事件不再重载页面 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">form</span> <span class="attr">v-on:submit.prevent</span>=<span class="string">&quot;onSubmit&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">form</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 修饰符可以串联 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">v-on:click.stop.prevent</span>=<span class="string">&quot;doThat&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 只有修饰符 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">form</span> <span class="attr">v-on:submit.prevent</span>&gt;</span><span class="tag">&lt;/<span class="name">form</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 添加事件监听器时使用事件捕获模式 --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 即内部元素触发的事件先在此处理，然后才交由内部元素进行处理 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-on:click.capture</span>=<span class="string">&quot;doThis&quot;</span>&gt;</span>...<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 只当在 event.target 是当前元素自身时触发处理函数 --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 即事件不是从内部元素触发的 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-on:click.self</span>=<span class="string">&quot;doThat&quot;</span>&gt;</span>...<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 点击事件将只会触发一次 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">a</span> <span class="attr">v-on:click.once</span>=<span class="string">&quot;doThis&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 而不会等待 `onScroll` 完成  --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 这其中包含 `event.preventDefault()` 的情况 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-on:scroll.passive</span>=<span class="string">&quot;onScroll&quot;</span>&gt;</span>...<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="按键修饰符"><a href="#按键修饰符" class="headerlink" title="按键修饰符"></a>按键修饰符</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 只有在 `key` 是 `Enter` 时调用 `vm.submit()` --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">v-on:keyup.enter</span>=<span class="string">&quot;submit&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="表单输入绑定"><a href="#表单输入绑定" class="headerlink" title="表单输入绑定"></a>表单输入绑定</h2><h3 id="文本-1"><a href="#文本-1" class="headerlink" title="文本"></a>文本</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">span</span>&gt;</span>Multiline message is:<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">p</span> <span class="attr">style</span>=<span class="string">&quot;white-space: pre-line;&quot;</span>&gt;</span>&#123;&#123; message &#125;&#125;<span class="tag">&lt;/<span class="name">p</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">textarea</span> <span class="attr">v-model</span>=<span class="string">&quot;message&quot;</span> <span class="attr">placeholder</span>=<span class="string">&quot;add multiple lines&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">textarea</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="复选框"><a href="#复选框" class="headerlink" title="复选框"></a>复选框</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&#x27;example-3&#x27;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;checkbox&quot;</span> <span class="attr">value</span>=<span class="string">&quot;Jack&quot;</span> <span class="attr">v-model</span>=<span class="string">&quot;checkedNames&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">label</span> <span class="attr">for</span>=<span class="string">&quot;jack&quot;</span>&gt;</span>Jack<span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;checkbox&quot;</span> <span class="attr">value</span>=<span class="string">&quot;John&quot;</span> <span class="attr">v-model</span>=<span class="string">&quot;checkedNames&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">label</span> <span class="attr">for</span>=<span class="string">&quot;john&quot;</span>&gt;</span>John<span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;checkbox&quot;</span> <span class="attr">value</span>=<span class="string">&quot;Mike&quot;</span> <span class="attr">v-model</span>=<span class="string">&quot;checkedNames&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">label</span> <span class="attr">for</span>=<span class="string">&quot;mike&quot;</span>&gt;</span>Mike<span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">span</span>&gt;</span>Checked names: &#123;&#123; checkedNames &#125;&#125;<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#example-3&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">checkedNames</span>: []</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="单选按钮"><a href="#单选按钮" class="headerlink" title="单选按钮"></a>单选按钮</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;example-4&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;radio&quot;</span> <span class="attr">value</span>=<span class="string">&quot;One&quot;</span> <span class="attr">v-model</span>=<span class="string">&quot;picked&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">label</span> <span class="attr">for</span>=<span class="string">&quot;one&quot;</span>&gt;</span>One<span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">&quot;radio&quot;</span> <span class="attr">value</span>=<span class="string">&quot;Two&quot;</span> <span class="attr">v-model</span>=<span class="string">&quot;picked&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">label</span> <span class="attr">for</span>=<span class="string">&quot;two&quot;</span>&gt;</span>Two<span class="tag">&lt;/<span class="name">label</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">br</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">span</span>&gt;</span>Picked: &#123;&#123; picked &#125;&#125;<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;#example-4&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">picked</span>: <span class="string">&#x27;&#x27;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="选择框"><a href="#选择框" class="headerlink" title="选择框"></a>选择框</h3><p>单选</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 多选时select中增加 `multiple` ,data中的selected改为数组 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">select</span> <span class="attr">v-model</span>=<span class="string">&quot;selected&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">option</span> <span class="attr">v-for</span>=<span class="string">&quot;option in options&quot;</span> <span class="attr">v-bind:value</span>=<span class="string">&quot;option.value&quot;</span>&gt;</span></span><br><span class="line">        &#123;&#123; option.text &#125;&#125;</span><br><span class="line">    <span class="tag">&lt;/<span class="name">option</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">select</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">span</span>&gt;</span>Selected: &#123;&#123; selected &#125;&#125;<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="attr">el</span>: <span class="string">&#x27;...&#x27;</span>,</span><br><span class="line">    <span class="attr">data</span>: &#123;</span><br><span class="line">        <span class="attr">selected</span>: <span class="string">&#x27;A&#x27;</span>,</span><br><span class="line">        <span class="attr">options</span>: [&#123;</span><br><span class="line">                <span class="attr">text</span>: <span class="string">&#x27;One&#x27;</span>,</span><br><span class="line">                <span class="attr">value</span>: <span class="string">&#x27;A&#x27;</span></span><br><span class="line">            &#125;,</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="attr">text</span>: <span class="string">&#x27;Two&#x27;</span>,</span><br><span class="line">                <span class="attr">value</span>: <span class="string">&#x27;B&#x27;</span></span><br><span class="line">            &#125;,</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="attr">text</span>: <span class="string">&#x27;Three&#x27;</span>,</span><br><span class="line">                <span class="attr">value</span>: <span class="string">&#x27;C&#x27;</span></span><br><span class="line">            &#125;</span><br><span class="line">        ]</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="修饰符-1"><a href="#修饰符-1" class="headerlink" title="修饰符"></a>修饰符</h3><h4 id="lazy"><a href="#lazy" class="headerlink" title=".lazy"></a>.lazy</h4><p>在默认情况下，v-model 在每次 input 事件触发后将输入框的值与数据进行同步 (除了上述输入法组合文字时)。你可以添加 lazy 修饰符，从而转变为使用 change 事件进行同步：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 在“change”时而非“input”时更新 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">v-model.lazy</span>=<span class="string">&quot;msg&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="number"><a href="#number" class="headerlink" title=".number"></a>.number</h4><p>如果想自动将用户的输入值转为数值类型，可以给 v-model 添加 number 修饰符：<br>这通常很有用，因为即使在 type=”number” 时，HTML 输入元素的值也总会返回字符串。如果这个值无法被 parseFloat() 解析，则会返回原始的值。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">v-model.number</span>=<span class="string">&quot;age&quot;</span> <span class="attr">type</span>=<span class="string">&quot;number&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><h4 id="trim"><a href="#trim" class="headerlink" title=".trim"></a>.trim</h4><p>如果要自动过滤用户输入的首尾空白字符，可以给 v-model 添加 trim 修饰符：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">input</span> <span class="attr">v-model.trim</span>=<span class="string">&quot;msg&quot;</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="组件注册"><a href="#组件注册" class="headerlink" title="组件注册"></a>组件注册</h2><p>通过 Vue.component 全局注册，名称使用 kebab-case样式<br><strong>一个组件的 data 选项必须是一个函数</strong>，因此每个实例可以维护一份被返回对象的独立的拷贝</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;components-demo&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button-counter</span>&gt;</span><span class="tag">&lt;/<span class="name">button-counter</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button-counter</span>&gt;</span><span class="tag">&lt;/<span class="name">button-counter</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">button-counter</span>&gt;</span><span class="tag">&lt;/<span class="name">button-counter</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="comment">// 定义一个名为 button-counter 的新组件</span></span><br><span class="line">Vue.component(<span class="string">&#x27;button-counter&#x27;</span>, &#123;</span><br><span class="line">    <span class="attr">data</span>: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> &#123;</span><br><span class="line">            <span class="attr">count</span>: <span class="number">0</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">template</span>: <span class="string">&#x27;&lt;button v-on:click=&quot;count++&quot;&gt;You clicked me &#123;&#123; count &#125;&#125; times.&lt;/button&gt;&#x27;</span></span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="传递数据到子组件"><a href="#传递数据到子组件" class="headerlink" title="传递数据到子组件"></a>传递数据到子组件</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">blog-post</span> <span class="attr">post-title</span>=<span class="string">&quot;My journey with Vue&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">blog-post</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">blog-post</span> <span class="attr">post-title</span>=<span class="string">&quot;Blogging with Vue&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">blog-post</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">blog-post</span> <span class="attr">post-title</span>=<span class="string">&quot;Why Vue is so fun&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">blog-post</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">blog-post</span> <span class="attr">v-for</span>=<span class="string">&quot;post in posts&quot;</span> <span class="attr">v-bind:key</span>=<span class="string">&quot;post.id&quot;</span> <span class="attr">v-bind:title</span>=<span class="string">&quot;post.title&quot;</span> <span class="attr">v-bind:content</span>=<span class="string">&quot;post.content&quot;</span> <span class="attr">v-bind:publishedAt</span>=<span class="string">&quot;post.publishedAt&quot;</span> <span class="attr">v-bind:comments</span>=<span class="string">&quot;post.comments&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">blog-post</span>&gt;</span></span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// props 选项将其包含在该组件可接受的 prop 列表中</span></span><br><span class="line">Vue.component(<span class="string">&#x27;blog-post&#x27;</span>, &#123;</span><br><span class="line">    <span class="attr">props</span>: [<span class="string">&#x27;post-title&#x27;</span>],</span><br><span class="line">    <span class="attr">template</span>: <span class="string">&#x27;&lt;h3&gt;&#123;&#123; title &#125;&#125;&lt;/h3&gt;&#x27;</span></span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><h3 id="动态组件"><a href="#动态组件" class="headerlink" title="动态组件"></a>动态组件</h3><p>在不同组件之间进行动态切换</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 组件会在 `currentTabComponent` 改变时改变 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">component</span> <span class="attr">v-bind:is</span>=<span class="string">&quot;currentTabComponent&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">component</span>&gt;</span></span><br></pre></td></tr></table></figure><p>特殊渲染</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- &lt;ul&gt;、&lt;ol&gt;、&lt;table&gt; 和 &lt;select&gt; --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">table</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">tr</span> <span class="attr">is</span>=<span class="string">&quot;blog-post-row&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">tr</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">table</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="局部注册"><a href="#局部注册" class="headerlink" title="局部注册"></a>局部注册</h3><p>外部构建后  导入</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="keyword">import</span> BaseButton <span class="keyword">from</span> <span class="string">&#x27;./BaseButton.vue&#x27;</span></span><br><span class="line"><span class="keyword">import</span> BaseIcon <span class="keyword">from</span> <span class="string">&#x27;./BaseIcon.vue&#x27;</span></span><br><span class="line"><span class="keyword">import</span> BaseInput <span class="keyword">from</span> <span class="string">&#x27;./BaseInput.vue&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span><br><span class="line">    <span class="attr">components</span>: &#123;</span><br><span class="line">        <span class="string">&quot;base-button&quot;</span>: BaseButton,</span><br><span class="line">        <span class="string">&quot;base-icon&quot;</span>: BaseIcon,</span><br><span class="line">        <span class="string">&quot;base-input&quot;</span>: BaseInput</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Prop"><a href="#Prop" class="headerlink" title="Prop"></a>Prop</h2><h3 id="传递静态或动态-Prop"><a href="#传递静态或动态-Prop" class="headerlink" title="传递静态或动态 Prop"></a>传递静态或动态 Prop</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- &lt;blog-post title=&quot;My journey with Vue&quot;&gt;&lt;/blog-post&gt; --&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 尽可能使用v-bind --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 动态赋予一个变量的值 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">blog-post</span> <span class="attr">v-bind:title</span>=<span class="string">&quot;post.title&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">blog-post</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 动态赋予一个复杂表达式的值 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">blog-post</span> <span class="attr">v-bind:title</span>=<span class="string">&quot;post.title + &#x27; by &#x27; + post.author.name&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">blog-post</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="Prop-验证"><a href="#Prop-验证" class="headerlink" title="Prop 验证"></a>Prop 验证</h3><p>控制台的警告, 方便他人调用</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line">Vue.component(<span class="string">&#x27;my-component&#x27;</span>, &#123;</span><br><span class="line">    <span class="attr">props</span>: &#123;</span><br><span class="line">        <span class="comment">// 基础的类型检查 ( `null` 和 `undefined` 会通过任何类型验证)</span></span><br><span class="line">        <span class="attr">propA</span>: <span class="built_in">Number</span>,</span><br><span class="line">        <span class="comment">// 多个可能的类型</span></span><br><span class="line">        <span class="attr">propB</span>: [<span class="built_in">String</span>, <span class="built_in">Number</span>],</span><br><span class="line">        <span class="comment">// 必填的字符串</span></span><br><span class="line">        <span class="attr">propC</span>: &#123;</span><br><span class="line">            <span class="attr">type</span>: <span class="built_in">String</span>,</span><br><span class="line">            <span class="attr">required</span>: <span class="literal">true</span></span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="comment">// 带有默认值的数字</span></span><br><span class="line">        <span class="attr">propD</span>: &#123;</span><br><span class="line">            <span class="attr">type</span>: <span class="built_in">Number</span>,</span><br><span class="line">            <span class="attr">default</span>: <span class="number">100</span></span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="comment">// 带有默认值的对象</span></span><br><span class="line">        <span class="attr">propE</span>: &#123;</span><br><span class="line">            <span class="attr">type</span>: <span class="built_in">Object</span>,</span><br><span class="line">            <span class="comment">// 对象或数组默认值必须从一个工厂函数获取</span></span><br><span class="line">            <span class="attr">default</span>: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">                <span class="keyword">return</span> &#123;</span><br><span class="line">                    <span class="attr">message</span>: <span class="string">&#x27;hello&#x27;</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;,</span><br><span class="line">        <span class="comment">// 自定义验证函数</span></span><br><span class="line">        <span class="attr">propF</span>: &#123;</span><br><span class="line">            <span class="attr">validator</span>: <span class="function"><span class="keyword">function</span>(<span class="params">value</span>) </span>&#123;</span><br><span class="line">                <span class="comment">// 这个值必须匹配下列字符串中的一个</span></span><br><span class="line">                <span class="keyword">return</span> [<span class="string">&#x27;success&#x27;</span>, <span class="string">&#x27;warning&#x27;</span>, <span class="string">&#x27;danger&#x27;</span>].indexOf(value) !== -<span class="number">1</span></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p>type 类型</p><ul><li>String</li><li>Number</li><li>Boolean</li><li>Array</li><li>Object</li><li>Date</li><li>Function</li><li>Symbol</li></ul><h2 id="过滤器"><a href="#过滤器" class="headerlink" title="过滤器"></a>过滤器</h2><p>常用于文本预处理</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- HTML --&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- 在双花括号中 --&gt;</span></span><br><span class="line">&#123;&#123; message | capitalize &#125;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 在 `v-bind` 中 --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">v-bind:id</span>=<span class="string">&quot;rawId | formatId&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 串联 --&gt;</span></span><br><span class="line">&#123;&#123; message | filterA | filterB &#125;&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 传参 --&gt;</span></span><br><span class="line">&#123;&#123; message | filterA(&#x27;arg1&#x27;, arg2) &#125;&#125;</span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// JavaScript</span></span><br><span class="line"><span class="attr">filters</span>: &#123;</span><br><span class="line">    <span class="attr">capitalize</span>: <span class="function"><span class="keyword">function</span>(<span class="params">value</span>) </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (!value) <span class="keyword">return</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">        value = value.toString()</span><br><span class="line">        <span class="keyword">return</span> value.charAt(<span class="number">0</span>).toUpperCase() + value.slice(<span class="number">1</span>)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 全局过滤器</span></span><br><span class="line">Vue.filter(<span class="string">&#x27;capitalize&#x27;</span>, <span class="function"><span class="keyword">function</span>(<span class="params">value</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (!value) <span class="keyword">return</span> <span class="string">&#x27;&#x27;</span></span><br><span class="line">    value = value.toString()</span><br><span class="line">    <span class="keyword">return</span> value.charAt(<span class="number">0</span>).toUpperCase() + value.slice(<span class="number">1</span>)</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line"><span class="keyword">new</span> Vue(&#123;</span><br><span class="line">    <span class="comment">// ...</span></span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">Vue开发手册</summary>
    
    
    
    <category term="code" scheme="https://wukong1024.github.io/categories/code/"/>
    
    
    <category term="learn" scheme="https://wukong1024.github.io/tags/learn/"/>
    
    <category term="code" scheme="https://wukong1024.github.io/tags/code/"/>
    
  </entry>
  
  <entry>
    <title>简单思考</title>
    <link href="https://wukong1024.github.io/2020/02/24/%E7%AE%80%E5%8D%95%E6%80%9D%E8%80%83/"/>
    <id>https://wukong1024.github.io/2020/02/24/%E7%AE%80%E5%8D%95%E6%80%9D%E8%80%83/</id>
    <published>2020-02-24T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="简单思考"><a href="#简单思考" class="headerlink" title="简单思考"></a>简单思考</h1><p>一、经商不是打仗</p><ol><li>热情才是成功的条件，怀着使命感为用户尽心尽力</li><li>商业的简单本质是什么——由用户和商家构成的生态系统</li><li>经商不是打仗——不盯对手，只盯用户</li><li>经营不是管理——自由是技术创新之源</li><li>思考问题不以金钱为中心——专注于创造价值</li><li>人是公司的一切——厉害的角色引来厉害的角色</li></ol><p>二、依靠自己感性的生活</p><ol start="7"><li>工作要自己争取——把想做的事情当成工作</li><li>不追求金钱和名誉——总是置身于能实际感受到成长的场所</li><li>工作辛劳是理所应当的——知道取得成果时的幸福，这才是职业人</li><li>依自己的感性生活——不迎合公司和上司</li><li>不察言观色——害怕客户而非职场上的批评</li><li>不当专家——不做偏离本质的努力</li><li>从一无所有中锻炼——正因为资源不足人才要思考</li><li>深思熟虑直至握有确信——深思熟虑后的失败是成功之母</li><li>享受不安——未来不确定，所以有无限的可能性</li></ol><p>三、不断舍弃成功</p><ol start="16"><li>不让公司变成动物园——建设一个出成果者得回报的公司</li><li>不断舍弃成功——提高自身市场价值的唯一方法</li><li>坦率地说话——含蓄的表述会损害工作</li><li>越是优秀的人越不会吵架——拘泥于胜负者成不了事</li><li>人事评估简单是最好的——越复杂不满情绪越高涨</li><li>公司不是学校——培养员工的自主性绝无可能</li><li>不提升士气——缺乏干劲的人没资格做职场中人</li></ol><p>四、不需要大人物</p><ol start="23"><li>不需要大人物——真正领导者用自己的梦想推动人</li><li>不需要统一管理——现场员工才是最高决策者</li><li>商业不需要人情——不营造骄纵的结构</li><li>不把经营理念书面化——徒增形式的理念将摧毁公司</li><li>不需要构想——预期判断未来 不如专注于眼前的事</li><li>不简单的不是战略——难以理解的信息会扰乱工作市场</li><li>守则不能改——做好心理准备，抛弃过去的成功</li></ol><p>五、 精简一切多余的工作</p><ol start="30"><li>不需要计划——计划导致应变能力下降</li><li>不需要事务员——不分计划者和实行者</li><li>靠机制无法成功——操作手册会破坏创造性</li><li>不需要规划——丢弃一切阻碍速度的东西</li><li>不开会议——排除增加会议的人</li><li>不需要信息共享——多余的信息指挥带来多余的思考</li></ol><p>六、不追求创新</p><ol start="36"><li>不以差异化为目标——用户不追求差别只追求价值</li><li>不追求创新——始终耿直地回应当下的需求</li><li>实现 质量*速度的最大化——抛弃制造方的自我满足</li><li>设计主导一切——最优考虑用户的使用便利性</li><li>用户不会告诉我们答案——深挖用户的声音，靠我们自己的头脑思考</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;简单思考&quot;&gt;&lt;a href=&quot;#简单思考&quot; class=&quot;headerlink&quot; title=&quot;简单思考&quot;&gt;&lt;/a&gt;简单思考&lt;/h1&gt;&lt;p&gt;一、经商不是打仗&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;热情才是成功的条件，怀着使命感为用户尽心尽力&lt;/li&gt;
&lt;li&gt;商业的简单本质是</summary>
      
    
    
    
    <category term="read" scheme="https://wukong1024.github.io/categories/read/"/>
    
    
    <category term="read" scheme="https://wukong1024.github.io/tags/read/"/>
    
    <category term="笔记" scheme="https://wukong1024.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>Win10</title>
    <link href="https://wukong1024.github.io/2020/01/01/Win10/"/>
    <id>https://wukong1024.github.io/2020/01/01/Win10/</id>
    <published>2020-01-01T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Win10"><a href="#Win10" class="headerlink" title="Win10"></a>Win10</h1><p>文件报毒，关闭Windows自带安全中心<a class="link"   href="https://www.bilibili.com/video/av91158542" >教程<i class="fas fa-external-link-alt"></i></a> </p><p>右键无法新建TXT文档的问题解决<a class="link"   href="https://www.xp.cn/b.php/5753.html" >教程<i class="fas fa-external-link-alt"></i></a></p><p>蓝屏 事件 17 （计算机管理&gt;事件查看器&gt;Windows日志&gt;系统&gt;）</p><p>事件17禁用8086DEV_A33C<br>下载炫龙芯片组驱动</p><p>事件10016 注册表权限</p><p>修复  <a class="link"   href="https://bbs.kafan.cn/thread-2188450-1-1.html" >教程<i class="fas fa-external-link-alt"></i></a></p><p><a class="link"   href="https://www.xinyucn.cc/2020/05/zhong_ji_jie_jue_win10_lan_pin.html" >教程<i class="fas fa-external-link-alt"></i></a></p><p>关闭PCI省电 控制面板》电源选项》当前电源计划》更改计划设置》更改高级电源设置》PCI Ex’p’ress》链路状态电源管理》全关闭</p><p>蓝屏   事件 10016 <a class="link"   href="https://blog.csdn.net/i_myxxx/article/details/87886217" >教程<i class="fas fa-external-link-alt"></i></a></p>]]></content>
    
    
    <summary type="html">Win10优化设置</summary>
    
    
    
    <category term="note" scheme="https://wukong1024.github.io/categories/note/"/>
    
    
    <category term="learn" scheme="https://wukong1024.github.io/tags/learn/"/>
    
    <category term="note" scheme="https://wukong1024.github.io/tags/note/"/>
    
  </entry>
  
  <entry>
    <title>小程序_云开发</title>
    <link href="https://wukong1024.github.io/2019/12/28/%E5%B0%8F%E7%A8%8B%E5%BA%8F_%E4%BA%91%E5%BC%80%E5%8F%91/"/>
    <id>https://wukong1024.github.io/2019/12/28/%E5%B0%8F%E7%A8%8B%E5%BA%8F_%E4%BA%91%E5%BC%80%E5%8F%91/</id>
    <published>2019-12-28T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="小程序"><a href="#小程序" class="headerlink" title="小程序"></a>小程序</h1><blockquote><p>应用将无处不在，随时可用，但又无需安装卸载</p></blockquote><p>[TOC]</p><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p>优点</p><ul><li>速度快</li><li>无需适配</li><li>社交分享</li><li>出色体验</li><li>用完即走，随手可得</li><li>低门槛</li></ul><p>设计规范</p><ul><li>友好：重点突出，流程明确</li><li>清晰：导航明确，减少等待，异常反馈</li><li>便捷：减少输入，避免误操作，操作流畅</li></ul><h2 id="代码笔记"><a href="#代码笔记" class="headerlink" title="代码笔记"></a>代码笔记</h2><p>传递自定义数据属性</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 父html</span></span><br><span class="line">bindtap=<span class="string">&#x27;f1&#x27;</span> data-user-name=<span class="string">&#x27;balabala&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 父js</span></span><br><span class="line"><span class="keyword">var</span> userName = e.currentTarget.dataset.userName</span><br><span class="line">wx.navigateTo(&#123;</span><br><span class="line">    <span class="attr">url</span>:<span class="string">&#x27;url?username=&#x27;</span>+userName</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 子js</span></span><br><span class="line"><span class="attr">onload</span>:<span class="function"><span class="keyword">function</span>(<span class="params">options</span>)</span>&#123;</span><br><span class="line">    <span class="keyword">var</span> username=options.username</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>界面加载</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 默认加载第一个路径</span></span><br><span class="line"><span class="string">&quot;pages&quot;</span>: [</span><br><span class="line">    <span class="string">&quot;pages/start/start&quot;</span>,</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>rpx相对长度单位</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">iPhone6 屏宽 750rpx  1px=2rpx</span><br></pre></td></tr></table></figure><p>弹性盒子</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">display</span>:flex;</span><br><span class="line"><span class="attribute">flex-direction</span>:column;</span><br><span class="line"><span class="attribute">justify-content</span>:space-around;</span><br><span class="line"><span class="attribute">align-items</span>:center;</span><br></pre></td></tr></table></figure><h2 id="云开发简介"><a href="#云开发简介" class="headerlink" title="云开发简介"></a>云开发简介</h2><p>Tencent Cloud Base(TCB) 一站式后端云服务</p><p>编程基础：HTML,CSS,Js,Node.js,MongoDB</p><h3 id="初始化项目"><a href="#初始化项目" class="headerlink" title="初始化项目"></a>初始化项目</h3><p>在miniprogram下打开终端</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">npm init -y</span><br><span class="line">npm i vant-weapp -S --production</span><br><span class="line">npm i wx-server-sdk -S</span><br><span class="line"></span><br><span class="line">“详情”中勾选 npm 模块</span><br><span class="line">“工具”中选择 构建npm</span><br><span class="line"></span><br><span class="line">json中增加</span><br><span class="line">&#123;</span><br><span class="line">    &quot;usingComponents&quot;:&#123;</span><br><span class="line">        &quot;van-button&quot;: &quot;vant-weapp/button&quot;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">小程序云开发基础</summary>
    
    
    
    <category term="code" scheme="https://wukong1024.github.io/categories/code/"/>
    
    
    <category term="learn" scheme="https://wukong1024.github.io/tags/learn/"/>
    
    <category term="code" scheme="https://wukong1024.github.io/tags/code/"/>
    
  </entry>
  
  <entry>
    <title>罗素-我为什么而活着</title>
    <link href="https://wukong1024.github.io/2019/10/12/%E7%BD%97%E7%B4%A0-%E6%88%91%E4%B8%BA%E4%BB%80%E4%B9%88%E8%80%8C%E6%B4%BB%E7%9D%80/"/>
    <id>https://wukong1024.github.io/2019/10/12/%E7%BD%97%E7%B4%A0-%E6%88%91%E4%B8%BA%E4%BB%80%E4%B9%88%E8%80%8C%E6%B4%BB%E7%9D%80/</id>
    <published>2019-10-12T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="罗素-我为什么而活着"><a href="#罗素-我为什么而活着" class="headerlink" title="罗素-我为什么而活着"></a>罗素-我为什么而活着</h1><p>我为什么而活着</p><p>对爱情的渴望，对知识的追求，对人类苦难不可遏制的同情心，这三种纯洁而无比强烈的激情支配着我的一生。这三种激情，就像飓风一样，在深深的苦海上，肆意地把我吹来吹去，吹到濒临绝望的边缘。</p><p>我寻求爱情，首先因为爱情给我带来狂喜，它如此强烈以致我经常愿意为了几小时的欢愉而牺牲生命中的其他一切。我寻求爱情，其次是因为爱情可以解除孤寂一—那是一颗震颤的心，在世界的边缘，俯瞰那冰冷死寂、深不可测的深渊。我寻求爱情，最后是因为在爱情的结合中，我看到圣徒和诗人们所想像的天堂景象的神秘缩影。这就是我所寻求的，虽然它对人生似乎过于美好，然而最终我还是得到了它。</p><p>我以同样的热情寻求知识，我渴望了解人的心灵。我渴望知道星星为什么闪闪发光，我试图理解毕达哥拉斯的思想威力，即数字支配着万物流转。这方面我获得一些成就，然而并不多。</p><p>爱情和知识，尽其可能地把我引上天堂，但是同情心总把我带回尘世。痛苦的呼唤经常在我心中回荡，饥饿的儿童，被压迫被折磨者，被儿女视为负担的无助的老人以及充满孤寂、贫穷和痛苦的整个世界，都是对人类应有生活的嘲讽。我渴望减轻这些不幸，但是我无能为力，而且我自己也深受其害。</p><p>这就是我的一生，我觉得值得为它活着。如果有机会的话，我还乐意再活一次。</p><p>英文原文：</p><p>What I Have Lived For</p><p>by Bertrand Russell</p><p>Three passions, simple but overwhelmingly strong, have governed my life: the longing for love, the search for knowledge, and unbearable pity for the suffering of mankind. These passions, like great winds, have blown me hither and thither, in a wayward course, over a great ocean of anguish, reaching to the very verge of despair.</p><p>I have sought love, first, because it brings ecstasy – ecstasy so great that I would often have sacrificed all the rest of life for a few hours of this joy. I have sought it, next, because it relieves loneliness–that terrible loneliness in which one shivering consciousness looks over the rim of the world into the cold unfathomable lifeless abyss. I have sought it finally, because in the union of love I have seen, in a mystic miniature, the prefiguring vision of the heaven that saints and poets have imagined. This is what I sought, and though it might seem too good for human life, this is what–at last–I have found.</p><p>With equal passion I have sought knowledge. I have wished to understand the hearts of men. I have wished to know why the stars shine. And I have tried to apprehend the Pythagorean power by which number holds sway above the flux. A little of this, but not much, I have achieved.</p><p>Love and knowledge, so far as they were possible, led upward toward the heavens. But always pity brought me back to earth. Echoes of cries of pain reverberate in my heart. Children in famine, victims tortured by oppressors, helpless old people a burden to their sons, and the whole world of loneliness, poverty, and pain make a mockery of what human life should be. I long to alleviate this evil, but I cannot, and I too suffer.</p><p>This has been my life. I have found it worth living, and would gladly live it again if the chance were offered me.</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;罗素-我为什么而活着&quot;&gt;&lt;a href=&quot;#罗素-我为什么而活着&quot; class=&quot;headerlink&quot; title=&quot;罗素-我为什么而活着&quot;&gt;&lt;/a&gt;罗素-我为什么而活着&lt;/h1&gt;&lt;p&gt;我为什么而活着&lt;/p&gt;
&lt;p&gt;对爱情的渴望，对知识的追求，对人类苦难不可遏制</summary>
      
    
    
    
    <category term="read" scheme="https://wukong1024.github.io/categories/read/"/>
    
    
    <category term="read" scheme="https://wukong1024.github.io/tags/read/"/>
    
    <category term="转载" scheme="https://wukong1024.github.io/tags/%E8%BD%AC%E8%BD%BD/"/>
    
  </entry>
  
  <entry>
    <title>创新之路</title>
    <link href="https://wukong1024.github.io/2019/09/23/%E5%88%9B%E6%96%B0%E4%B9%8B%E8%B7%AF/"/>
    <id>https://wukong1024.github.io/2019/09/23/%E5%88%9B%E6%96%B0%E4%B9%8B%E8%B7%AF/</id>
    <published>2019-09-23T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="创新之路"><a href="#创新之路" class="headerlink" title="创新之路"></a>创新之路</h1><p>你必须有两个能达到前 25%水平的领域，这两个领域的交集就是你的职业方向。</p><p>输出文化 而不是价值观。</p><p>你不应该进入那种行业，做了两年的人可以和那些已经做了二十年的人，具有一样的工作效率。</p><p>能够获得暴利的职业，都有一个共同特点：可扩展性（scaling），一次劳动可以服务成千上万的人。</p><p>好的程序员有三种美德：「懒惰」(Laziness) 、「不耐烦」(Impatience) 、以及「傲慢」(Hubris)</p><p>复杂的协调，战略资源的整合者，集合式创新，将现有技术做成产品，服务普通人。</p><p>完善他人的想法，优化他人的发明，集合成令人难以抗拒的新产品。</p><p>普及优质的教育，带来改变自身命运的机会。</p><p>创新是思考下一个，提升人们生活水平的工具是什么，并有做成这件事的信心和信念，无论承担多大的风险，为实现它，付出一切。</p><p>好奇心产生的愉悦感，分泌出积极的神经化学激素（多巴胺，内啡肽），一种内在的激励机制，去探索，去学习。</p><p>预知未来最好的办法是创造未来</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;创新之路&quot;&gt;&lt;a href=&quot;#创新之路&quot; class=&quot;headerlink&quot; title=&quot;创新之路&quot;&gt;&lt;/a&gt;创新之路&lt;/h1&gt;&lt;p&gt;你必须有两个能达到前 25%水平的领域，这两个领域的交集就是你的职业方向。&lt;/p&gt;
&lt;p&gt;输出文化 而不是价值观。&lt;/p&gt;
</summary>
      
    
    
    
    <category term="read" scheme="https://wukong1024.github.io/categories/read/"/>
    
    
    <category term="read" scheme="https://wukong1024.github.io/tags/read/"/>
    
    <category term="笔记" scheme="https://wukong1024.github.io/tags/%E7%AC%94%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>旧手机Blog</title>
    <link href="https://wukong1024.github.io/2019/08/30/%E6%97%A7%E6%89%8B%E6%9C%BABlog/"/>
    <id>https://wukong1024.github.io/2019/08/30/%E6%97%A7%E6%89%8B%E6%9C%BABlog/</id>
    <published>2019-08-30T00:00:00.000Z</published>
    <updated>2024-12-20T23:45:05.000Z</updated>
    
    <content type="html"><![CDATA[<h1 id="Blog"><a href="#Blog" class="headerlink" title="Blog"></a>Blog</h1><p>参考链接</p><ul><li><a class="link"   href="https://blog.verkey.org/384.html" >废旧Android+LNMP+Ngrok 打造”移动云主机”<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://blog.csdn.net/fighting_sxw/article/details/89845908" >小米5安装Centos7(Linux Deploy)<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://segmentfault.com/a/1190000015628625" >CentOS 7 下 安装 Python3.7<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://blog.csdn.net/warylee/article/details/84628345" >Linux下安装Perl 5<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://blog.csdn.net/lkgCSDN/article/details/84403329" >pip is configured with locations that require TLS/SSL问题<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://segmentfault.com/a/1190000012030061" >virtualenv和virtualenvwrapper介绍、安装和使用<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://linux.cn/article-8215-1.html" >screen<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://fengli.su/archives/android-ngrok.html" >安卓手机内网穿透ngrok<i class="fas fa-external-link-alt"></i></a></li><li><a class="link"   href="https://github.com/inconshreveable/ngrok/issues/315" >GET /wordpress/ 301 Moved Permanently<i class="fas fa-external-link-alt"></i></a></li></ul><h2 id="在安卓上安装Liunx"><a href="#在安卓上安装Liunx" class="headerlink" title="在安卓上安装Liunx"></a>在安卓上安装Liunx</h2><p>所需软件</p><ul><li><a class="link"   href="https://github.com/meefik/busybox/releases" >Busy Box<i class="fas fa-external-link-alt"></i></a>Linux deploy 支撑软件</li><li><a class="link"   href="https://github.com/meefik/linuxdeploy/releases" >Linux deploy<i class="fas fa-external-link-alt"></i></a> Linux系统支撑软件</li></ul><p>安装后两个软件都需要开启root权限 Busy Box无需其它设置 其中 architecture 为 处理器架构</p><h3 id="Linux-Deploy设置"><a href="#Linux-Deploy设置" class="headerlink" title="Linux Deploy设置"></a>Linux Deploy设置</h3><p>左侧菜单设置</p><ul><li>屏幕常亮 关</li><li>锁定WiFi 开</li><li>保持CPU唤醒 开</li><li>PATH变量 /system/xbin</li></ul><h3 id="安装Ubuntu"><a href="#安装Ubuntu" class="headerlink" title="安装Ubuntu"></a>安装Ubuntu</h3><p>右下角系统安装配置</p><ul><li>容器类型 chroot</li><li>发行版GNU/Linux Ubuntu</li><li>架构 armhf</li><li>发行版GNU/Linux版本 xenial</li><li>源地址 <a class="link"   href="http://202.141.160.110/ubuntu-ports" >http://202.141.160.110/ubuntu-ports<i class="fas fa-external-link-alt"></i></a></li><li>安装类型 镜像文件</li><li>本地化 zn_CN. UTF-8</li><li>启动SSH服务器 开</li></ul><h3 id="安装CentOS"><a href="#安装CentOS" class="headerlink" title="安装CentOS"></a>安装CentOS</h3><p>右下角系统安装配置</p><ul><li>容器类型 chroot</li><li>发行版GNU/Linux CentOS</li><li>架构 aarch64</li><li>发行版GNU/Linux版本 7</li><li>源地址 <a class="link"   href="https://mirrors.tuna.tsinghua.edu.cn/centos-altarch/" >https://mirrors.tuna.tsinghua.edu.cn/centos-altarch/<i class="fas fa-external-link-alt"></i></a></li><li>安装类型 镜像文件</li><li>本地化 zn_CN. UTF-8</li><li>启动SSH服务器 开</li></ul><p>设置完成后点击右上角的安装按钮开始安装，大概15分钟。</p><p>看到&lt;&lt;&lt;deploy则安装完成，如果中间没有报错说明安装成功！点击启动如果没有’ssh fail’ 等报错,<br>说明启动成功了，可以用终端软件链接。</p><h2 id="配置开发环境"><a href="#配置开发环境" class="headerlink" title="配置开发环境"></a>配置开发环境</h2><h3 id="screen"><a href="#screen" class="headerlink" title="screen"></a>screen</h3><p>安装screen</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum install screen</span><br></pre></td></tr></table></figure><p>screen基本命令</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"># 创建新会话</span><br><span class="line">screen -S name</span><br><span class="line"># 从 screen 会话中分离</span><br><span class="line">Ctrl-a 和 d</span><br><span class="line"># 列出对话</span><br><span class="line">screen -ls</span><br><span class="line"># 还原对话</span><br><span class="line">screen -r name</span><br><span class="line">结束对话</span><br><span class="line">进入后输入 exit</span><br></pre></td></tr></table></figure><h3 id="python"><a href="#python" class="headerlink" title="python"></a>python</h3><p>安装python3.7 过程中需要安装’yum install gcc’和’yum install make’</p><p>pip使用错误见参考链接</p><h4 id="虚拟环境"><a href="#虚拟环境" class="headerlink" title="虚拟环境"></a>虚拟环境</h4><p>配置虚拟环境</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"># 安装virtualenv</span><br><span class="line">pip install virtualenv</span><br><span class="line"></span><br><span class="line"># 添加软链接</span><br><span class="line">find / -name virtualenv</span><br><span class="line">ln -s /usr/local/python3/bin/virtualenv /usr/bin/virtualenv</span><br><span class="line"></span><br><span class="line">pip install virtualenvwrapper</span><br><span class="line"></span><br><span class="line"># 配置profile</span><br><span class="line">find / -name virtualenvwrapper.sh</span><br><span class="line">vi /etc/profile</span><br><span class="line"># 增加</span><br><span class="line">export WORKON_HOME=/root/virtualenvs</span><br><span class="line">source /usr/local/python3/bin/virtualenvwrapper.sh</span><br><span class="line"># 执行</span><br><span class="line">source /etc/profile</span><br></pre></td></tr></table></figure><p>virtualenvwrapper基本命令</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"># 新建</span><br><span class="line">mkvirtualenv test --python=python3  </span><br><span class="line"># 查看列表</span><br><span class="line">workon</span><br><span class="line"># 激活</span><br><span class="line">workon test</span><br><span class="line"># 退出</span><br><span class="line">deactivate</span><br><span class="line"># 删除</span><br><span class="line">rmvirtualenv test</span><br></pre></td></tr></table></figure><h2 id="最终方案"><a href="#最终方案" class="headerlink" title="最终方案"></a>最终方案</h2><p><a class="link"   href="https://fengli.su/archives/android-ngrok.html" >安卓手机内网穿透ngrok<i class="fas fa-external-link-alt"></i></a></p><p>KSWEB+Termux+ngork</p><p>安装KSWEB到手机，开启Apache，安装工具phpMyAdmin，下载源码到安卓目录下的htdocs</p><p>使用ngrok开启内网渗透</p><p>Termux替代工具NeoTerm</p><p>目前常用在局域网文件传输，启动KSWEB后，浏览器输入手机固定ip+端口，可以自由上传和删除目录下的文件，使用MT文件夹可以将htdocs下的data/User/admin/home 设置为主目录 (同样在5.0网络下，平均速度在10M/s)</p>]]></content>
    
    
    <summary type="html">在安卓平台虚拟机搭建博客平台</summary>
    
    
    
    <category term="system" scheme="https://wukong1024.github.io/categories/system/"/>
    
    
    <category term="learn" scheme="https://wukong1024.github.io/tags/learn/"/>
    
    <category term="linux" scheme="https://wukong1024.github.io/tags/linux/"/>
    
  </entry>
  
</feed>
