<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>李经纶HEXO博客</title>
  
  <subtitle>李经纶HEXO博客</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://lijinglun.com/"/>
  <updated>2026-07-24T05:13:05.508Z</updated>
  <id>https://lijinglun.com/</id>
  
  <author>
    <name>李经纶</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Cursor编辑器的使用技巧</title>
    <link href="https://lijinglun.com/2024/10/10/Cursor%E7%BC%96%E8%BE%91%E5%99%A8%E7%9A%84%E4%BD%BF%E7%94%A8%E6%8A%80%E5%B7%A7/"/>
    <id>https://lijinglun.com/2024/10/10/Cursor编辑器的使用技巧/</id>
    <published>2024-10-10T07:57:33.000Z</published>
    <updated>2026-07-24T05:13:05.508Z</updated>
    
    <content type="html"><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>最近更新不及时，一方面是沉迷《黑神话 悟空》，毕竟期待了很久，但是玩起来还是觉得有点失望，主要是战斗系统挺拉胯的，各种bug层出不穷，到处是空气墙，巨多过度动画，也是草草的通关了一周目后就卸载了。</p><h3 id="爆火的AI编辑器"><a href="#爆火的AI编辑器" class="headerlink" title="爆火的AI编辑器"></a>爆火的AI编辑器</h3><p>最近爆火的编辑器非 Cursor 莫属，深度集成了各个AI模型，pro版本可以使用 claude-3.5-sonnet 的模型，也可以手动配置OpenAI API Key、Google API Key等；具备自动补全、多行、多文件的编辑，代码修正、代码预测、AI聊天等功能；我已经深度体验了一段时间，生成了几个有趣的chrome插件，日常的编码和代码学习等，所以升级了Pro账号；下面记录一下我自己使用时的一些方式与技巧，以此作为记录。</p><h3 id="使用技巧"><a href="#使用技巧" class="headerlink" title="使用技巧"></a>使用技巧</h3><ul><li><strong>通过注释快速生成代码</strong><br>  这个是我最常用的方法，在编写代码时，先通过写好注释的方式，顺便理清思路，然后可以通过 Cursor Tab 功能，根据注释乱来生成代码，写好注释的重要性。</li><li><strong>Cmd + L 聊天，Cmd + K 编辑，Cmd + I composer功能</strong><br>  聊天和编辑是最频繁使用的功能，可以通过聊天描述自己的需求，返回代码后，然后不足的地方使用编辑功能去做修改，composer应该是Cursor最强大的功能了，很适合从头开始一个项目，然后AI新建文件及内容，也可以用来批量替换，代码整体重构。</li><li><strong>@ 符号</strong><br>  在聊天、编辑、composer中都可以使用：<ul><li><code>@Files</code> 引用文件</li><li><code>@Folders</code> 引用文件夹</li><li><code>@Code</code> 代码</li><li><code>@Web</code> 搜索</li><li><code>@Docs</code> 引用外部文档，可以快速了解API，也可以根据一些文档实现某些功能，</li><li><code>@Git</code> 引用git的commits、diffs、pr等，可以根据某次提交进行一些修改及对比等</li><li><code>@Codebase</code> 代码库</li></ul></li><li><strong>+按钮添加文件</strong><br>  在聊天、composer中，都可以添加文件去做询问和发送内容，除此之外，如果编码上面有些不如意的地方，也可以截图拖进聊天、composer中，让AI去识别。</li><li><strong>提交git commit</strong><br>  在Cursor的终端中，也可以使用编辑功能，我常用来生成代码修改后的commit，例：根据代码变更内容，生成commit。</li><li><strong>生成文档</strong><br>  如果代码写完了，不知道改如何生成一个文档，可以让Cursor根据codebase去生成比如readme.md,也可以同时生成英文或其他语言版本。</li><li><strong>切换模型</strong><br>  在聊天，编辑、composer中都可以手动点击切换模型，也可以用快捷键CMD + /</li></ul><h3 id="常用快捷键"><a href="#常用快捷键" class="headerlink" title="常用快捷键"></a>常用快捷键</h3><ul><li><strong>CMD + L</strong> 聊天</li><li><strong>CMD + K</strong> 内联编辑</li><li><strong>CMD + I</strong> Composer</li><li><strong>CMD + P</strong> 添加文件</li><li><strong>CMD + SHIFT + I</strong> 全屏Compose</li><li><strong>CMD + /</strong> 切换模型</li></ul><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>使用了一段时间，感慨AI的强大，但是对于个人对于代码及需求的描述要准确，不然很容易出现一堆问题；对于新项目，开发起来确实速度飞快，提高效率，但是越是趋于完善越觉得AI的无力，感觉虽然90%的工作他都做完了，但是最后的10%就是无法准确实现，毕竟每个项目都是不同的；其次是对于老项目的修改一定要慎重，AI很难根据你的需求或描述实现，只能说针对某些行代码做什么样的修改会更准确；总体来说，还是非常值得使用的，大大降低了编程的过程中试错的成本，是一个优秀的结对编程助手。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h3&gt;&lt;p&gt;最近更新不及时，一方面是沉迷《黑神话 悟空》，毕竟期待了很久，但是玩起来还是觉得有点失望，主要是战斗系统挺拉胯的，各种bug层出不穷，到处是
      
    
    </summary>
    
      <category term="教程" scheme="https://lijinglun.com/cates/%E6%95%99%E7%A8%8B/"/>
    
    
      <category term="随笔" scheme="https://lijinglun.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
      <category term="教程" scheme="https://lijinglun.com/tags/%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>修复action自动部署hexo报错的问题</title>
    <link href="https://lijinglun.com/2024/09/10/%E4%BF%AE%E5%A4%8Daction%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2hexo%E6%8A%A5%E9%94%99%E7%9A%84%E9%97%AE%E9%A2%98/"/>
    <id>https://lijinglun.com/2024/09/10/修复action自动部署hexo报错的问题/</id>
    <published>2024-09-10T09:11:58.000Z</published>
    <updated>2026-07-24T05:13:05.504Z</updated>
    
    <content type="html"><![CDATA[<h3 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h3><p>因为这个hexo的静态blog，之前一直是使用github action自动部署的，但是一段时间发现无法自动部署了，也没有管他，就手动部署blog，但是长久下来还是比较麻烦，所以还是需要解决下。<br>具体的报错信息是：</p><p>这是我本身的action.yml文件，并没有什么特殊内容，就是code分支有代码提交等变动时，执行<strong>solybum/hexo-deploy@master</strong>这个action，然后把.public文件夹部署到仓库的master分支。<br><figure class="highlight yml"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># Simple workflow for deploying static content to GitHub Pages</span></span><br><span class="line"><span class="attr">name:</span> <span class="string">Deploy</span> <span class="string">static</span> <span class="string">content</span> <span class="string">to</span> <span class="string">Hexo</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="comment"># Runs on pushes targeting the default branch</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span> <span class="string">["code"]</span></span><br><span class="line"></span><br><span class="line">  <span class="comment"># Allows you to run this workflow manually from the Actions tab</span></span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Allow one concurrent deployment</span></span><br><span class="line"><span class="attr">concurrency:</span></span><br><span class="line">  <span class="attr">group:</span> <span class="string">"pages"</span></span><br><span class="line">  <span class="attr">cancel-in-progress:</span> <span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="comment"># Single deploy job since we're just deploying</span></span><br><span class="line">  <span class="attr">blog-jinglun:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v3</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Setup</span> <span class="string">Node</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-node@v1</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">node-version:</span> <span class="string">'12.x'</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span> <span class="string">and</span> <span class="string">Deploy</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">solybum/hexo-deploy@master</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="attr">PERSONAL_TOKEN:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.ACCESS_TOKEN</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">BRANCH:</span> <span class="string">master</span>  <span class="comment"># The branch the action should deploy to.</span></span><br><span class="line">          <span class="attr">PUBLISH_DIR:</span> <span class="string">./public</span> <span class="comment"># The folder the action should deploy.</span></span><br></pre></td></tr></table></figure></p><p>查看action.yml执行过程中，发现是<strong>solybum/hexo-deploy@master</strong>这个action无法找到，所以报错了。</p><p>报错信息如下：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">Error:</span> <span class="string">Unable</span> <span class="string">to</span> <span class="string">resolve</span> <span class="string">action</span> <span class="string">solybum/hexo-deploy,</span> <span class="string">repository</span> <span class="string">not</span> <span class="string">found</span></span><br></pre></td></tr></table></figure><p>通过这个错误信息，可以知道是<strong>solybum/hexo-deploy</strong>这个action找不到，所以报错了，然后按照格式来说，solybum/hexo-deploy应该是一个用户下的仓库地址或者npm包地址，@master应该是主分支，然后在搜索引擎搜索 <strong>solybum/hexo-deploy@master</strong> 关键字，发现确实应该有这个地址，然后也找到了这个项目仓库地址<br><a href="https://github.com/Solybum/hexo-deploy/" target="_blank" rel="noopener">https://github.com/Solybum/hexo-deploy/</a><br>但是打开就显示 404 ，我想这个仓库要么被删除了，要么被设为私密，那么没办法，只能换一个action了。</p><h3 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h3><ul><li><p>首先，我先在hexo官网找到的GitHub Pages，<a href="https://hexo.io/docs/github-pages.html" target="_blank" rel="noopener">https://hexo.io/docs/github-pages.html</a> ，看上去肯定是可以用的，就是略显冗余，太多的steps</p></li><li><p>然后在到github的marketplace里面找到action模块，搜索hexo相关的内容，发现里面内容还是很多的，最终选择了 <strong>renzhaosy/hexo-deploy-action@master</strong> 这个action，总体来说，变化不多，可以正常使用。<br><img src="1.png" alt="action"></p></li></ul><p>修改的代码：<br><figure class="highlight yml"><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="bullet">-</span> <span class="attr">name:</span> <span class="string">Build</span> <span class="string">and</span> <span class="string">Deploy</span></span><br><span class="line">  <span class="attr">uses:</span> <span class="string">renzhaosy/hexo-deploy-action@master</span></span><br><span class="line">  <span class="attr">env:</span></span><br><span class="line">    <span class="attr">PERSONAL_TOKEN:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.ACCESS_TOKEN</span> <span class="string">&#125;&#125;</span></span><br><span class="line">    <span class="attr">BRANCH:</span> <span class="string">master</span>  <span class="comment"># The branch the action should deploy to.</span></span><br><span class="line">    <span class="attr">PUBLISH_DIR:</span> <span class="string">./public</span> <span class="comment"># The folder the action should deploy.</span></span><br></pre></td></tr></table></figure></p><h3 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h3><p>记录一下自己的思考及解决问题的过程，同时在使用第三方插件、仓库一类时，要考虑可用性和维护性，如果你的action也有类似问题，可以参考下。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;起因&quot;&gt;&lt;a href=&quot;#起因&quot; class=&quot;headerlink&quot; title=&quot;起因&quot;&gt;&lt;/a&gt;起因&lt;/h3&gt;&lt;p&gt;因为这个hexo的静态blog，之前一直是使用github action自动部署的，但是一段时间发现无法自动部署了，也没有管他，就手动部署b
      
    
    </summary>
    
      <category term="随笔" scheme="https://lijinglun.com/cates/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="随笔" scheme="https://lijinglun.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
      <category term="教程" scheme="https://lijinglun.com/tags/%E6%95%99%E7%A8%8B/"/>
    
      <category term="bug修复" scheme="https://lijinglun.com/tags/bug%E4%BF%AE%E5%A4%8D/"/>
    
  </entry>
  
  <entry>
    <title>通过cloudflare搭建免费的梯子</title>
    <link href="https://lijinglun.com/2024/09/06/%E9%80%9A%E8%BF%87cloudflare%E6%90%AD%E5%BB%BA%E5%85%8D%E8%B4%B9%E7%9A%84%E6%A2%AF%E5%AD%90/"/>
    <id>https://lijinglun.com/2024/09/06/通过cloudflare搭建免费的梯子/</id>
    <published>2024-09-06T07:06:55.000Z</published>
    <updated>2026-07-24T05:13:05.489Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>今天给大家分享一个梯子的搭建方法，不用花钱订阅，不用购买服务器，不需要购买域名，完全免费的方案，速度非常之快，而且可以访问chatgpt等网站。</p></blockquote><p>先看下速度和节点<br><img src="1.png" alt="测速"></p><h3 id="注册cloudflare"><a href="#注册cloudflare" class="headerlink" title="注册cloudflare"></a>注册cloudflare</h3><ol><li>注册账号，<a href="https://dash.cloudflare.com/login" target="_blank" rel="noopener">https://dash.cloudflare.com/login</a> ，这个不用多说了，输入邮件、密码注册即可，然后验证一下邮件地址就行了。</li></ol><h3 id="部署代理pages"><a href="#部署代理pages" class="headerlink" title="部署代理pages"></a>部署代理pages</h3><ol><li>打开Workers和Pages这个栏目，然后点击上面的创建按钮，即可，右侧的请求数量是可以看到你今天的请求量，最多 <strong>每天10W次</strong> 的数量，不过放心，很难用到10w的。<br><img src="2.png" alt="创建"></li><li>点击创建后，标签栏目上选择Pages，然后点击上传资产。<br><img src="3.png" alt="创建pages"></li><li>接下来就是创建项目，填写项目名称，可以随意起，填写完成后，点击创建项目。<br><img src="4.png" alt="上传项目"></li><li>创建完项目后，即可上传项目资产，我们先下载一个worker.zip包， <a href="https://raw.githubusercontent.com/cmliu/edgetunnel/main/worker.zip" target="_blank" rel="noopener">https://raw.githubusercontent.com/cmliu/edgetunnel/main/worker.zip</a> ，然后选择上传压缩文件。<br><img src="5.png" alt="代码包"></li><li>点击部署站点就ok了，随后点击继续处理项目的按钮。<br><img src="6.png" alt="部署"></li><li>会跳到项目的部署栏目，选择设置栏目，添加环境变量，名称填写为 <strong>UUID</strong> ，切记一定是大写的，然后可以在 google、baidu 找生成UUID的工具，类似 <a href="https://www.gongjuwa.com/uuid/" target="_blank" rel="noopener">https://www.gongjuwa.com/uuid/</a> ，复制到值里面，一定记得把前后的空格去掉，加密不加密都可以，点击保存即可，UUID找地方存一下，后面还有用。<br><img src="7.png" alt="设置1"><br><img src="8.png" alt="设置2"></li><li>我们回到<strong>部署</strong>栏目，点击右侧<strong>访问</strong>链接。<br><img src="9.png" alt="设置"><br>即可看到浏览器打开新的页面，里面出现了数据信息，就代表你自己的梯子其实已经完成了80%，cloudflare分配给的地址就是我们的入口。<br><img src="10.png" alt="设置"></li><li>我们刚才保存的UUID，添加在分配给的地址之后在访问，会发现显示Not found，接着我们再次部署刚才下载好的worker.zip文件夹。<br><img src="11.png" alt="访问"></li><li>我们再次回到项目下的部署，点击创建新部署按钮，<br><img src="12.png" alt="设置"><br>选择从计算机中选择，选择上传压缩文件，还是选择上面下载的worker.zip包，完成后，点击保存并部署，这次你已经完成了99%了。<br><img src="13.png" alt="设置"><br><img src="14.png" alt="设置"></li><li>我们再次访问项目分配的域名+UUID后，发现能够出现流量的代理地址了。<br><img src="15.png" alt="设置"><br>可以看到有很多订阅地址，也支持Base64、clash-meta、sing-box等订阅格式，同时页面上也显示了是使用Vless协议，所以我们还需要支持Vless协议的代理软件才行。</li></ol><h3 id="使用工具"><a href="#使用工具" class="headerlink" title="使用工具"></a>使用工具</h3><ol><li>工具推荐V2rayU， 下载地址：<br>Windows: <a href="https://github.com/2dust/v2rayN/releases" target="_blank" rel="noopener">https://github.com/2dust/v2rayN/releases</a><br>Mac: <a href="https://github.com/yanue/V2rayU/releases" target="_blank" rel="noopener">https://github.com/yanue/V2rayU/releases</a><br>Assets下，可以根据自身电脑类型选择下载并安装。</li><li>以我自己的mac为例，点击V2rayU，选择订阅设置，地址填写：<strong>项目分配的域名+UUID</strong> ，备注随意填写，添加更新后即可。<br><img src="16.png" alt="设置"><br>然后关闭订阅设置，点开服务器列表，即可看到上面地球图标+上面填写的订阅名称，里面有50个订阅地址，选择一个延迟较低的使用就行。<br><img src="17.png" alt="订阅"></li></ol><h3 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h3><p>上面的proxy地址我已经删了，大家使用自己的地址，目前稳定用了一段时间了，每天开发加浏览页面，最高一次也只是达到4w的请求次数，距离10w还是有一定的距离的，大家快去用吧。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;今天给大家分享一个梯子的搭建方法，不用花钱订阅，不用购买服务器，不需要购买域名，完全免费的方案，速度非常之快，而且可以访问chatgpt等网站。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;先看下速度和节点&lt;br&gt;&lt;img src=&quot;1.png&quot; a
      
    
    </summary>
    
      <category term="工具" scheme="https://lijinglun.com/cates/%E5%B7%A5%E5%85%B7/"/>
    
    
      <category term="工具" scheme="https://lijinglun.com/tags/%E5%B7%A5%E5%85%B7/"/>
    
      <category term="教程" scheme="https://lijinglun.com/tags/%E6%95%99%E7%A8%8B/"/>
    
      <category term="cloudflare" scheme="https://lijinglun.com/tags/cloudflare/"/>
    
      <category term="翻墙" scheme="https://lijinglun.com/tags/%E7%BF%BB%E5%A2%99/"/>
    
      <category term="梯子" scheme="https://lijinglun.com/tags/%E6%A2%AF%E5%AD%90/"/>
    
  </entry>
  
  <entry>
    <title>团队管理上遇到的一些小问题</title>
    <link href="https://lijinglun.com/2024/09/02/%E5%9B%A2%E9%98%9F%E7%AE%A1%E7%90%86%E4%B8%8A%E9%81%87%E5%88%B0%E7%9A%84%E4%B8%80%E4%BA%9B%E5%B0%8F%E9%97%AE%E9%A2%98/"/>
    <id>https://lijinglun.com/2024/09/02/团队管理上遇到的一些小问题/</id>
    <published>2024-09-02T11:00:15.000Z</published>
    <updated>2026-07-24T05:13:05.489Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>最近我加入了一个初创团队，这里的每个成员都非常有能力和经验，但项目的进展却陷入了瓶颈。团队内部显得有些混乱：开发人员各自埋头于手头的任务，没有人对项目的整体进度有清晰的了解；跨职能团队之间的沟通不畅，经常导致工作返工；大家看似忙碌，但却缺乏明确的方向。就像一只手掌，每根手指都在不同的方向发力：有的向上，有的向下，有的向左，有的向右，彼此各自为战，难以形成合力。<br>面对这种状况，我意识到，这个团队急需一个清晰的管理框架和有效的沟通机制，来理顺大家的工作方向，才能让所有人共同朝着相同的目标努力。</p></blockquote><h3 id="问题的具体表现"><a href="#问题的具体表现" class="headerlink" title="问题的具体表现"></a>问题的具体表现</h3><ul><li>缺乏统一的项目计划和目标：团队成员不了解项目的整体方向和优先级，各自为战。</li><li>沟通不畅：相关人员之间的信息流转不畅，导致工作效率低下，反复修改。</li><li>责任不明确：各个成员的责任不清晰，没有明确的负责人，导致人人都是负责人，人人也都不为此负责的情况。</li><li>士气低落和缺乏动力：成员各自忙碌却看不到明确的成果或进展，影响整体士气。</li></ul><h3 id="分析问题根源"><a href="#分析问题根源" class="headerlink" title="分析问题根源"></a>分析问题根源</h3><ul><li>缺乏清晰的领导和决策机制：在初创环境中，公司方向及老板界定的目标不断变换，导致leader们缺乏明确的决策机制和领导者角色。</li><li>项目管理方法不适用或不充分：团队没有使用合适的项目管理工具或方法，导致信息和进度的混乱。</li><li>沟通文化不健全：团队内部的沟通渠道不畅通，缺乏有效的沟通机制和反馈机制。</li><li>目标和优先级模糊：大家不清楚项目的关键目标和每个阶段的优先任务。</li></ul><h3 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h3><ul><li>设定明确的目标和计划：建立一个清晰的项目计划，将大目标分解为小的可执行任务，每个任务都有明确的负责人和截止日期。</li><li>引入合适的项目管理工具：推荐使用一些项目管理工具（如JIRA、Trello、Tapd），帮助团队跟踪任务和进度，确保信息透明和可见。</li><li>建立高效的沟通流程：定期召开团队会议和一对一沟通，建立开放的沟通渠道，确保所有人了解项目的最新进展和变化。</li><li>定义清晰的角色和责任：明确每个团队成员的角色和职责，让每个人知道自己对项目的具体贡献和期望。</li><li>推行敏捷管理方法：引入敏捷管理项目方法，如Scrum或Kanban，以更快地响应变化和需求，同时更好地管理项目进度。</li></ul><h3 id="期望效果"><a href="#期望效果" class="headerlink" title="期望效果"></a>期望效果</h3><ul><li>提高工作效率和项目透明度：每个人都清楚项目进展、自己的任务、他人的进度，减少重复劳动和时间浪费。</li><li>增强团队协作和沟通：更顺畅的信息流动有助于减少误解和沟通失误，提升整体团队协作。</li><li>明确责任，提高员工积极性：清晰的职责分配让每个人知道自己的重要性，有助于提升团队士气和动力。</li><li>更快、更灵活地应对变化：敏捷管理方式有助于团队快速适应变化，及时调整项目方向。</li></ul><h3 id="定期修改方向与策略"><a href="#定期修改方向与策略" class="headerlink" title="定期修改方向与策略"></a>定期修改方向与策略</h3><ul><li>定期的与成员沟通，通过成员的反馈，不断的总结和调整，确保团队不断学习和优化管理策略。</li></ul><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>目前还是在不断优化完善中，但是这种团队的改变或者说改革还是很必要的，虽说有点不太顺利，会遇到一些不适应和抵触情绪，但是通过持续的沟通、反馈和调整，可以让团队不断的成长和凝聚。</p><p>PS：<br>既不为难他人，也别为难自己。 </p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;blockquote&gt;
&lt;p&gt;最近我加入了一个初创团队，这里的每个成员都非常有能力和经验，但项目的进展却陷入了瓶颈。团队内部显得有些混乱：开发人员各自埋头于手头的任务，没有人对项目的整体进度有清晰的了解；跨职能团队之间的沟通不畅，经常导致工作返工；大家看似忙碌，但却缺乏明确的方
      
    
    </summary>
    
      <category term="随笔" scheme="https://lijinglun.com/cates/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="随笔" scheme="https://lijinglun.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>cloudflare的代理</title>
    <link href="https://lijinglun.com/2024/08/30/cloudflare%E7%9A%84%E4%BB%A3%E7%90%86/"/>
    <id>https://lijinglun.com/2024/08/30/cloudflare的代理/</id>
    <published>2024-08-30T07:09:20.000Z</published>
    <updated>2026-07-24T05:13:05.473Z</updated>
    
    <content type="html"><![CDATA[<center>【引言】</center><br>cloudflare对于我们开发者来说，应该并不陌生，和vercel类似，人称”赛博菩萨”，因为它对开发者提供了很多免费的工具和服务来提升网站的安全性、性能、稳定性，今天不去介绍什么是正向代理，什么是反向代理，有兴趣的可以自行搜索，今天主要是分享如何通过cloudflare的worker部署一个正向代理访问github一类网站的工具。<br><br><center>【前提】</center><br>域名（必备<br>cloudflare账号（必备<br><br><center>【绑定域名到cloudflare】</center><ul><li>步骤1：<br>在cloudflare首页中选择添加域<br><img src="1.png" style="transform: scale(0.6)"></li><li>步骤2：<br>输入你的域名<br><img src="2.png" style="transform: scale(0.6)"></li><li>步骤3：<br>选择免费版本<br><img src="3.png" style="transform: scale(0.6)"></li><li>步骤4：<br>修改域名的DNS<br><img src="4.png" style="transform: scale(0.6)"></li><li>步骤5：<br>以我阿里云域名为例，在域名管理里面选择DNS修改<br><img src="5.png" style="transform: scale(0.6)"></li><li>步骤6：<br>输入步骤4的DNS后，验证手机号码，一路确定就行了<br><img src="6.png" style="transform: scale(0.6)"></li><li>步骤7：<br>在cloudflare中继续操作，HTTPS都选择是就行。<br><img src="7.png" style="transform: scale(0.6)"></li><li>步骤8：<br>等待解析就行，一般不会太久，完成后会有邮件提醒，或者列表状态变更。<br><img src="8.png" style="transform: scale(0.6)"></li></ul><center>【部署worker】</center><ul><li>步骤1：<br>在cloudflare中的侧边栏Workers和Pages中，选择创建。<br><img src="9.png" style="transform: scale(0.6)"></li><li>步骤2：<br>创建worker<br><img src="10.png" style="transform: scale(0.6)"></li><li><p>步骤3：<br>里面为默认代码, 可以使用下面代码<br><img src="11.png" style="transform: scale(0.6)"></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></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> &#123;</span><br><span class="line">  <span class="keyword">async</span> fetch(request) &#123;</span><br><span class="line">    <span class="keyword">const</span> url = <span class="keyword">new</span> URL(request.url);</span><br><span class="line">    </span><br><span class="line">    <span class="comment">//被正向代理的域名或者ip:端口号</span></span><br><span class="line">    url.host = <span class="string">'github.com'</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> fetch(url, &#123; <span class="attr">headers</span>: request.headers, <span class="attr">method</span>: request.method, <span class="attr">body</span>: request.body &#125;);</span><br><span class="line">  &#125;,</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li><p>步骤4：<br>点击部署后，可以访问cloudflare分配给你的域名，如果访问不通，那么我就要把我们绑定cloudflare的域，添加到worker，可以随意添加你命名的二级域名，绑定成功后，等待自定义域生效，然后访问自己的二级域名，就实现了不用翻墙即可打开github等操作，切可登录。<br><img src="12.png" style="transform: scale(0.6)"></p></li></ul><p>  <center>【后续】</center><br>  其实worker能做到的事情很多，上面只写了简单的代理，其实里面还可以把上面的请求内容细化，包括一些image、js、接口请求的重定向等；还可以自定义cookie，header等内容；通过worker其实可以把别人的网站，分分钟转移到自己的上面，还能修改内容。</p><p>  PS：<br>    后续可以聊聊Pages，也是非常有意思，除了能做静态网站托管外，还可以搭建属于自己的梯子。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;center&gt;【引言】&lt;/center&gt;&lt;br&gt;cloudflare对于我们开发者来说，应该并不陌生，和vercel类似，人称”赛博菩萨”，因为它对开发者提供了很多免费的工具和服务来提升网站的安全性、性能、稳定性，今天不去介绍什么是正向代理，什么是反向代理，有兴趣的可以自行搜索
      
    
    </summary>
    
      <category term="工具" scheme="https://lijinglun.com/cates/%E5%B7%A5%E5%85%B7/"/>
    
    
      <category term="工具" scheme="https://lijinglun.com/tags/%E5%B7%A5%E5%85%B7/"/>
    
      <category term="教程" scheme="https://lijinglun.com/tags/%E6%95%99%E7%A8%8B/"/>
    
      <category term="cloudflare" scheme="https://lijinglun.com/tags/cloudflare/"/>
    
  </entry>
  
  <entry>
    <title>react中useImperativeHandle的使用</title>
    <link href="https://lijinglun.com/2024/08/16/react%E4%B8%ADuseImperativeHandle%E7%9A%84%E4%BD%BF%E7%94%A8/"/>
    <id>https://lijinglun.com/2024/08/16/react中useImperativeHandle的使用/</id>
    <published>2024-08-16T07:27:44.000Z</published>
    <updated>2026-07-24T05:13:05.473Z</updated>
    
    <content type="html"><![CDATA[<p><center>【引言】</center><br>页面中经常会有写全局的Modal、Alert、Toast、Login、等组件，这些组件通常会被用到很多页面中，如果每个页面都写一个Modal、Alert、Toast、Login、等组件，看起来不够美观，也不利于代码的维护。通过执行方法，即可调用全局的组件，而不需要每个页面都写一个Modal、Alert、Toast、Login、等组件。</p><p><center>【实现1】</center><br>子组件<br><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="keyword">import</span> React, &#123; useImperativeHandle, forwardRef, useRef &#125; <span class="keyword">from</span> <span class="string">'react'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> ChildComponent = forwardRef(<span class="function">(<span class="params">props, ref</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> inputRef = useRef();</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 使用 useImperativeHandle 自定义暴露给父组件的实例值</span></span><br><span class="line">    useImperativeHandle(ref, () =&gt; (&#123;</span><br><span class="line">        focus: <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">            inputRef.current.focus(); <span class="comment">// 暴露 focus 方法</span></span><br><span class="line">        &#125;,</span><br><span class="line">        getValue: <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> inputRef.current.value; <span class="comment">// 暴露获取输入值的方法</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="keyword">return</span> &lt;input ref=&#123;inputRef&#125; type="text" /&gt;;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></p><p>父组件</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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> React, &#123; useRef &#125; <span class="keyword">from</span> <span class="string">'react'</span>;</span><br><span class="line"><span class="keyword">import</span> ChildComponent <span class="keyword">from</span> <span class="string">'./ChildComponent'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> ParentComponent = <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> childRef = useRef();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> handleFocus = <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">        childRef.current.focus(); <span class="comment">// 调用子组件的 focus 方法</span></span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> handleGetValue = <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="built_in">console</span>.log(childRef.current.getValue()); <span class="comment">// 获取子组件的输入值</span></span><br><span class="line">    &#125;;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> (</span><br><span class="line">        &lt;div&gt;</span><br><span class="line">            &lt;ChildComponent ref=&#123;childRef&#125; /&gt;</span><br><span class="line">            &lt;button onClick=&#123;handleFocus&#125;&gt;Focus Input&lt;<span class="regexp">/button&gt;</span></span><br><span class="line"><span class="regexp">            &lt;button onClick=&#123;handleGetValue&#125;&gt;Get Input Value&lt;/</span>button&gt;</span><br><span class="line">        &lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">    );</span></span><br><span class="line"><span class="regexp">&#125;;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">export default ParentComponent;</span></span><br></pre></td></tr></table></figure><p><center>【实现2】</center><br><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><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></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">let</span> captcha = <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> Captcha = <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> [show, setShow] = useState(<span class="literal">false</span>);</span><br><span class="line">    <span class="keyword">const</span> captchaRef = useRef(<span class="literal">null</span>);</span><br><span class="line"></span><br><span class="line">    useImperativeHandle(captchaRef, () =&gt; (&#123;</span><br><span class="line">        show() &#123;</span><br><span class="line">            setShow(<span class="literal">true</span>); <span class="comment">// 暴露 show 方法</span></span><br><span class="line">        &#125;,</span><br><span class="line">        hide() &#123;</span><br><span class="line">            setShow(<span class="literal">false</span>);<span class="comment">// 暴露 hide 方法</span></span><br><span class="line">        &#125;</span><br><span class="line">    &#125;));</span><br><span class="line"></span><br><span class="line">    useEffect(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">        captcha = &#123;</span><br><span class="line">            show: <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">                captchaRef.current.show(); <span class="comment">// 暴露 show 方法</span></span><br><span class="line">            &#125;,</span><br><span class="line">            hide: <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">                captchaRef.current.hide(); <span class="comment">// 暴露 hide 方法</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="keyword">return</span> <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">            captcha = <span class="literal">null</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="keyword">return</span> (</span><br><span class="line">        show &amp;&amp; &lt;div className="captcha-b" ref=&#123;captchaRef&#125;&gt;&lt;/div&gt;</span><br><span class="line">    );</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> &#123;</span><br><span class="line">    Captcha,</span><br><span class="line">    captcha</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></p><p><center>【总结】</center><br>useImperativeHandle 是 React 中用于自定义暴露给父组件的实例值的 hook，它可以让子组件暴露给父组件方法，使得父组件可以直接调用子组件的方法。把组件挂载在根节点上，可以通过暴露出来的方法去调用。例上述方法2中，在引入captcha后，可以在组件需要的时机执行captcha.show()、captcha.hide() 方法，实现调用。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;center&gt;【引言】&lt;/center&gt;&lt;br&gt;页面中经常会有写全局的Modal、Alert、Toast、Login、等组件，这些组件通常会被用到很多页面中，如果每个页面都写一个Modal、Alert、Toast、Login、等组件，看起来不够美观，也不利于代码的维护。通
      
    
    </summary>
    
      <category term="react开发" scheme="https://lijinglun.com/cates/react%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Web开发" scheme="https://lijinglun.com/tags/Web%E5%BC%80%E5%8F%91/"/>
    
      <category term="react开发" scheme="https://lijinglun.com/tags/react%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>css实现中间内容撑开头尾效果</title>
    <link href="https://lijinglun.com/2024/08/16/css%E5%AE%9E%E7%8E%B0%E4%B8%AD%E9%97%B4%E5%86%85%E5%AE%B9%E6%92%91%E5%BC%80%E5%A4%B4%E5%B0%BE%E6%95%88%E6%9E%9C/"/>
    <id>https://lijinglun.com/2024/08/16/css实现中间内容撑开头尾效果/</id>
    <published>2024-08-16T06:45:01.000Z</published>
    <updated>2026-07-24T05:13:05.473Z</updated>
    
    <content type="html"><![CDATA[<center>【引言】</center><br>最近在做一个网站，需要实现一个中间内容撑开头尾效果，本来想用本办法定位的方式去做，但是发现能实现效果但是太麻烦了，最终经过参考与实践通过flex布局的方式去实现更为简单，同时grid布局也可以实现，下面附上代码。<br><br><!-- ![效果图](css.png) --><br><img src="css.png" style="zoom:20%;"><br><br><center>【实现效果】</center><h4 id="flex-实现效果："><a href="#flex-实现效果：" class="headerlink" title="flex 实现效果："></a>flex 实现效果：</h4><p>div结构如下<br><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></pre></td><td class="code"><pre><span class="line">&lt;div <span class="class"><span class="keyword">class</span></span>=<span class="string">"container"</span>&gt;</span><br><span class="line">  &lt;div <span class="class"><span class="keyword">class</span></span>=<span class="string">"header"</span>&gt;头部&lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">  &lt;div class="content"&gt;内容&lt;/</span>div&gt;</span><br><span class="line">  &lt;div <span class="class"><span class="keyword">class</span></span>=<span class="string">"footer"</span>&gt;尾部&lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">&lt;/</span>div&gt;</span><br></pre></td></tr></table></figure></p><p>container的css如下:<br><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><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="selector-class">.container</span> &#123;</span><br><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-between;</span><br><span class="line">    <span class="attribute">margin</span>: <span class="number">0</span> auto;</span><br><span class="line">    <span class="attribute">min-height</span>: <span class="number">100%</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.header</span>, <span class="selector-class">.footer</span> &#123;</span><br><span class="line">    <span class="attribute">background</span>: <span class="number">#fff</span>;</span><br><span class="line">    <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.content</span> &#123;</span><br><span class="line">    flex: 1; // 这行代码使得content占据剩余的空间</span><br><span class="line">    <span class="selector-tag">background</span>: <span class="selector-id">#f0f0f0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><h4 id="grid-实现效果："><a href="#grid-实现效果：" class="headerlink" title="grid 实现效果："></a>grid 实现效果：</h4><p>div 结构如上<br>css如下:<br><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><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="selector-class">.container</span> &#123;</span><br><span class="line">    <span class="attribute">display</span>: grid;</span><br><span class="line">    grid-template-rows: auto 1fr auto; // 设置高度</span><br><span class="line">    <span class="selector-tag">height</span>: 100<span class="selector-tag">vh</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.header</span>, <span class="selector-class">.footer</span> &#123;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#f1f1f1</span>;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">20px</span>;</span><br><span class="line">    <span class="attribute">text-align</span>: center;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.content</span> &#123;</span><br><span class="line">    <span class="attribute">background-color</span>: <span class="number">#e2e2e2</span>;</span><br><span class="line">    <span class="attribute">padding</span>: <span class="number">20px</span>;</span><br><span class="line">    <span class="attribute">text-align</span>: center;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;center&gt;【引言】&lt;/center&gt;&lt;br&gt;最近在做一个网站，需要实现一个中间内容撑开头尾效果，本来想用本办法定位的方式去做，但是发现能实现效果但是太麻烦了，最终经过参考与实践通过flex布局的方式去实现更为简单，同时grid布局也可以实现，下面附上代码。&lt;br&gt;&lt;br&gt;&lt;
      
    
    </summary>
    
      <category term="Web开发" scheme="https://lijinglun.com/cates/Web%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Web开发" scheme="https://lijinglun.com/tags/Web%E5%BC%80%E5%8F%91/"/>
    
      <category term="css" scheme="https://lijinglun.com/tags/css/"/>
    
  </entry>
  
  <entry>
    <title>实现一个chatgpt的网站</title>
    <link href="https://lijinglun.com/2023/08/25/%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AAchatgpt%E7%9A%84%E7%BD%91%E7%AB%99/"/>
    <id>https://lijinglun.com/2023/08/25/实现一个chatgpt的网站/</id>
    <published>2023-08-25T03:20:06.000Z</published>
    <updated>2026-07-24T05:13:05.463Z</updated>
    
    <content type="html"><![CDATA[<center>【引言】</center><br>由于前一段时间离职，处在一个gap期间，每天不是投简历就是刷题看剧陪娃，挺无聊的，无聊刷到一些技术文章，看都在推广自己的chatgpt相关的网站，我想不如自己也弄一个吧！方便自己和他人。<br><br><center>【前期准备】</center><ul><li>[x] chatgpt开通api服务</li><li>[x] 云服务器</li><li>[x] 短信服务</li><li>[x] 域名</li></ul><p>上面准备工作中，只有开通chatgpt的api算是最高难度的了，国内visa信用卡还不支持，就算是国外也不是所有的信用卡都支持，因此网上有一些虚拟信用卡的开通服务，但是也要慎用。我是找了美国的朋友，用他的信用卡开通。</p><center>【最终效果】</center><br><img src="1.png" style="zoom:50%;"><br><img src="2.png" style="zoom:50%;"><br><br><center>【遇到的问题】</center><ol><li>EventSource 请求返回拼接遇到空格和特殊字符的问题</li><li>打字机效果在服务器不显示</li><li>markdown转换效果不理想</li></ol><center>【解决方案】</center><ol><li>服务端返回的格式多为：<figure class="highlight java"><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">data:</span><br><span class="line">id:</span><br><span class="line">retry:</span><br><span class="line">event:</span><br><span class="line"></span><br><span class="line">data:</span><br><span class="line">id:</span><br><span class="line">retry:</span><br><span class="line">event:</span><br></pre></td></tr></table></figure></li></ol><p>有些字段会有换行符和特殊字符，这些字符如何直接格式化后拼接会报错，这种在返回代码中最为明显，所以在返回到了前端处理的时候，要处理一下，我是这么做的，如果可以直接JSON.parse的话，那么就正常取值，如果JSON.parse报错的话，手动截取引号中间的内容返回。</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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> newReg = <span class="function">(<span class="params">str: string</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">let</span> data = <span class="string">''</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> lines = str.split(<span class="string">'\n\n'</span>);</span><br><span class="line">  <span class="keyword">const</span> jsonObj = isJSON(str);</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (jsonObj) &#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; message &#125; = <span class="built_in">JSON</span>.parse(str);</span><br><span class="line">    <span class="keyword">if</span> (message === <span class="string">"余额不足"</span>) &#123;</span><br><span class="line">      data = <span class="string">`[<span class="subst">$&#123;message&#125;</span>, 请充值](/?recharge=true)`</span>;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      data = message;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; lines.length; i++) &#123;</span><br><span class="line">      <span class="keyword">const</span> line = lines[i].trim();</span><br><span class="line">      <span class="keyword">const</span> jsonString = line.substring(<span class="number">5</span>); <span class="comment">// 去掉开头的 "data:"</span></span><br><span class="line">      <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">const</span> obj = <span class="built_in">JSON</span>.parse(jsonString);</span><br><span class="line">        data += obj[<span class="string">'content'</span>];</span><br><span class="line">      &#125; <span class="keyword">catch</span> (e) &#123;</span><br><span class="line">        <span class="keyword">const</span> parsedObj = jsonString.slice(<span class="number">12</span>, <span class="number">-2</span>);</span><br><span class="line">        data += parsedObj;</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">  <span class="keyword">return</span> data;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="2"><li><p>打字机效果是文字一个一个出现的效果，这个效果在本地显示的好好的，但是服务器怎么都不显示，在google和github查了很多资料后，终于找到了是因为服务器的nginx的配置导致的，需要更改nginx.config配置。</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></pre></td><td class="code"><pre><span class="line">proxy_cache off;  <span class="comment"># 关闭缓存</span></span><br><span class="line">proxy_buffering off; <span class="comment"># 关闭响应缓存,最主要的代码</span></span><br><span class="line">chunked_transfer_encoding on;  <span class="comment"># 开启分块传输编码</span></span><br></pre></td></tr></table></figure></li><li><p>markdown这个确实是需要自己去处理返回的代码的语言类型，语言内容，我用的是MarkdownIt这个插件，具体实现如下</p></li></ol><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></pre></td><td class="code"><pre><span class="line">mdi.renderer.rules.code_inline = <span class="function"><span class="keyword">function</span> (<span class="params">tokens, idx, options, env, slf</span>) </span>&#123;</span><br><span class="line">  <span class="keyword">var</span> token = tokens[idx];</span><br><span class="line">  <span class="keyword">if</span>(token.markup == <span class="string">"```"</span>)&#123;</span><br><span class="line">    <span class="keyword">var</span> newlineIndex = token.content.indexOf(<span class="string">'\\n'</span>),</span><br><span class="line">        language = token.content.slice(<span class="number">0</span>, newlineIndex),</span><br><span class="line">        content = token.content.slice(newlineIndex+<span class="number">2</span>,token.content.length).replace(<span class="regexp">/\\n/g</span>, <span class="string">'\n'</span>).replace(<span class="regexp">/\\/g</span>, <span class="string">''</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// console.log(content)</span></span><br><span class="line">        <span class="keyword">const</span> validLang = !!(language &amp;&amp; hljs.getLanguage(language))</span><br><span class="line">        <span class="keyword">if</span> (validLang) &#123;</span><br><span class="line">          <span class="keyword">const</span> lang = language ?? <span class="string">''</span></span><br><span class="line">          <span class="keyword">return</span> highlightBlock(hljs.highlight(content, &#123; <span class="attr">language</span>: lang &#125;).value, lang, content)</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> highlightBlock(hljs.highlightAuto(content).value, <span class="string">''</span>, content)</span><br><span class="line">  &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">`&lt;code class="hljs code-block-body js" &gt;<span class="subst">$&#123;token.content&#125;</span>&lt;/code&gt;`</span></span><br><span class="line">  &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><center>【结束】</center><br>后期还是想接入一下Midjourney的api，并且后端重新使用Nodejs实现一遍；<br>最后还是放一下链接，欢迎大家注册试玩。<br><a href="https://ailin.work" target="_blank" rel="noopener">Ailin智能聊天机器人</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;center&gt;【引言】&lt;/center&gt;&lt;br&gt;由于前一段时间离职，处在一个gap期间，每天不是投简历就是刷题看剧陪娃，挺无聊的，无聊刷到一些技术文章，看都在推广自己的chatgpt相关的网站，我想不如自己也弄一个吧！方便自己和他人。&lt;br&gt;&lt;br&gt;&lt;center&gt;【前期准备】
      
    
    </summary>
    
      <category term="Web开发" scheme="https://lijinglun.com/cates/Web%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Web开发" scheme="https://lijinglun.com/tags/Web%E5%BC%80%E5%8F%91/"/>
    
      <category term="react开发" scheme="https://lijinglun.com/tags/react%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>bpmn.js 使用总结</title>
    <link href="https://lijinglun.com/2023/05/19/bpmn-js-%E4%BD%BF%E7%94%A8%E6%80%BB%E7%BB%93/"/>
    <id>https://lijinglun.com/2023/05/19/bpmn-js-使用总结/</id>
    <published>2023-05-19T02:33:23.000Z</published>
    <updated>2026-07-24T05:13:05.462Z</updated>
    
    <content type="html"><![CDATA[<p><center>【引言】</center><br>最近一段时间的工作重点在审批流和低代码平台，审批流的话，最开始是使用 Bpmn.js 去构建前端的流程图；使用了一段时间后，也算是得心应手，踩过很多坑，也淌平了很多恶心的需求吧，趁此机会总结一下。</p><p>基本上 bpmn 原有的元素从 UI 到功能上面都会有所更改，从左侧元素工具栏到中间的元素，连接线，元素的面板，基本上都要重新覆盖。</p><p><small>最终效果如下：</small><br><img src="bpmn.png" alt="image"></p><p><center>【正文】</center></p><h4 id="任务节点更换皮肤后，文字不显示或者文字不居中问题"><a href="#任务节点更换皮肤后，文字不显示或者文字不居中问题" class="headerlink" title="任务节点更换皮肤后，文字不显示或者文字不居中问题"></a>任务节点更换皮肤后，文字不显示或者文字不居中问题</h4><p>最开始想到的解决办法是手动处理每个sharp的样式，手动把 x,y,font-size,fill 给填上，这么做虽然可行，但是每个sharp的坐标，位置，大小，文字长度都得计算，觉得这并不是一个好方案，然后翻阅了 bpmn.js 的源码，看了他的实现，觉得可以在自定义这块重新在调用就可以了，实现如下代码:</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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> TextUtil <span class="keyword">from</span> <span class="string">'diagram-js/lib/util/Text.js'</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; assign &#125; <span class="keyword">from</span> <span class="string">'min-dash'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> defaultStyle = assign(&#123;</span><br><span class="line">    fontFamily: <span class="string">'Arial, sans-serif'</span>,</span><br><span class="line">    fontSize: <span class="number">12</span>,</span><br><span class="line">    fontWeight: <span class="string">'normal'</span>,</span><br><span class="line">    lineHeight: <span class="number">1.2</span></span><br><span class="line">&#125;);</span><br><span class="line"><span class="keyword">const</span> textUtil = <span class="keyword">new</span> TextUtil(&#123;</span><br><span class="line">    style: defaultStyle</span><br><span class="line">&#125;);</span><br><span class="line"><span class="keyword">const</span> elementStyle = &#123;</span><br><span class="line">    size: &#123;</span><br><span class="line">        <span class="string">"width"</span>: <span class="number">100</span></span><br><span class="line">    &#125;,</span><br><span class="line">    box: &#123;</span><br><span class="line">        <span class="string">"width"</span>: <span class="number">100</span>,</span><br><span class="line">        <span class="string">"height"</span>: <span class="number">80</span>,</span><br><span class="line">        <span class="string">"type"</span>: <span class="string">"bpmn:Task"</span>,</span><br><span class="line">    &#125;,</span><br><span class="line">    align: <span class="string">"center-middle"</span>,</span><br><span class="line">    padding: <span class="number">5</span>,</span><br><span class="line">    style: &#123;</span><br><span class="line">        <span class="string">"fill"</span>: <span class="string">"black"</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="keyword">const</span> text = textUtil.createText(element.businessObject.name, elementStyle);</span><br><span class="line">svgAppend(parentNode, text);</span><br><span class="line"><span class="keyword">return</span> text;</span><br></pre></td></tr></table></figure><h4 id="分支箭头更换皮肤后，箭头不变化"><a href="#分支箭头更换皮肤后，箭头不变化" class="headerlink" title="分支箭头更换皮肤后，箭头不变化"></a>分支箭头更换皮肤后，箭头不变化</h4><p><img src="branch.png" alt><br>监听bpmnModeler变化时，执行如下代码即可<br><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></pre></td><td class="code"><pre><span class="line">setArrowColor() &#123;</span><br><span class="line">  <span class="keyword">const</span> marker = svgCreate(<span class="string">'marker'</span>)</span><br><span class="line"></span><br><span class="line">  svgAttr(marker, &#123;</span><br><span class="line">    id: <span class="string">'sequenceflow-arrow-normal'</span>,</span><br><span class="line">    viewBox: <span class="string">'0 0 20 20'</span>,</span><br><span class="line">    refX: <span class="string">'11'</span>,</span><br><span class="line">    refY: <span class="string">'10'</span>,</span><br><span class="line">    markerWidth: <span class="string">'10'</span>,</span><br><span class="line">    markerHeight: <span class="string">'10'</span>,</span><br><span class="line">    orient: <span class="string">'auto'</span></span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> path = svgCreate(<span class="string">'path'</span>)</span><br><span class="line"></span><br><span class="line">  svgAttr(path, &#123;</span><br><span class="line">    d: <span class="string">'M 1 5 L 11 10 L 1 15 Z'</span>,</span><br><span class="line">    style:</span><br><span class="line">      <span class="string">' stroke-width: 1px; stroke-linecap: round; stroke-dasharray: 10000, 1; '</span></span><br><span class="line">  &#125;)</span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> defs = domQuery(<span class="string">'defs'</span>)</span><br><span class="line">  svgAppend(marker, path)</span><br><span class="line">  svgAppend(defs, marker)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></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><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="selector-id">#sequenceflow-arrow-normal</span> &#123;</span><br><span class="line">  <span class="attribute">fill</span>: <span class="number">#ACC2FF</span> <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">stroke</span>: <span class="number">#ACC2FF</span> <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.djs-connection</span> &#123;</span><br><span class="line">  path &#123;</span><br><span class="line">    <span class="selector-tag">stroke</span>: <span class="selector-id">#ACC2FF</span> !<span class="selector-tag">important</span>;</span><br><span class="line">    <span class="selector-tag">marker-end</span>: <span class="selector-tag">url</span>(<span class="selector-id">#sequenceflow-arrow-normal</span>) !<span class="selector-tag">important</span>;</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>因为 bpmn.js 是通过svg实现图形功能的，所以简单的是绝大部分的元素的隐藏都可以通过 css 来处理，只有少部分需要自行操作svg的属性。</p><h4 id="svg的添加、删除、增加属性等功能"><a href="#svg的添加、删除、增加属性等功能" class="headerlink" title="svg的添加、删除、增加属性等功能"></a>svg的添加、删除、增加属性等功能</h4><p>可以使用内置的tiny-svg这个库来解决，结合min-dom和min-dash其实能解决好多关于svg的问题，都是一些很简单也很好用的库，地址：</p><ul><li><a href="https://github.com/bpmn-io/tiny-svg" target="_blank" rel="noopener">tiny-svg</a></li></ul><p><center>【结束】</center><br>总的来说，学习和使用 bpmn.js 虽然看上去有一定的难度，但其实多尝试，就能够掌握这个工具，并且可以在其中实现自己的需求。网上的相关资料、源码以及API接口都比较详细，并且开发者的社区也非常活跃，所以我们可以尝试寻找适合自己的解决方案，并且不断尝试和探索最佳的使用方式和技巧。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;center&gt;【引言】&lt;/center&gt;&lt;br&gt;最近一段时间的工作重点在审批流和低代码平台，审批流的话，最开始是使用 Bpmn.js 去构建前端的流程图；使用了一段时间后，也算是得心应手，踩过很多坑，也淌平了很多恶心的需求吧，趁此机会总结一下。&lt;/p&gt;
&lt;p&gt;基本上 bp
      
    
    </summary>
    
      <category term="Web开发" scheme="https://lijinglun.com/cates/Web%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Web开发" scheme="https://lijinglun.com/tags/Web%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>独立域名项目改造为单域名项目</title>
    <link href="https://lijinglun.com/2023/05/15/%E7%8B%AC%E7%AB%8B%E5%9F%9F%E5%90%8D%E9%A1%B9%E7%9B%AE%E6%94%B9%E9%80%A0%E4%B8%BA%E5%8D%95%E5%9F%9F%E5%90%8D%E9%A1%B9%E7%9B%AE/"/>
    <id>https://lijinglun.com/2023/05/15/独立域名项目改造为单域名项目/</id>
    <published>2023-05-15T09:39:59.000Z</published>
    <updated>2026-07-24T05:13:05.462Z</updated>
    
    <content type="html"><![CDATA[<p><center>一 起因</center><br>公司项目要给客户独立部署，原来的项目的域名为：<br><figure class="highlight javascript"><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">a.xxx.com/</span><br><span class="line">b.xxx.com/</span><br></pre></td></tr></table></figure></p><p>改成为<br><figure class="highlight javascript"><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">xxx.com/a/</span><br><span class="line">xxx.com/b/</span><br></pre></td></tr></table></figure></p><p>总结一下更改的过程及内容</p><p><center>二 路由改动</center><br>vue路由增加base，react路由增加basename<br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">new</span> Router(&#123;</span><br><span class="line">  mode: <span class="string">'history'</span>,</span><br><span class="line">  saveScrollPosition: <span class="literal">true</span>,</span><br><span class="line">  scrollBehavior: <span class="function"><span class="params">()</span> =&gt;</span> (&#123;</span><br><span class="line">    y: <span class="number">0</span></span><br><span class="line">  &#125;),</span><br><span class="line">  base: <span class="built_in">window</span>.env.staticPath,</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></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></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> globalHistory = createBrowserHistory(&#123;</span><br><span class="line">  basename: <span class="built_in">window</span>.env.staticPath</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure><p><center>三 打包路径改动</center><br>vue的话，看cli的版本，但是变化不大，基本上都是publicPath，react的话，如果是create-react-app就是homepage，其余的框架本身也是类似publicPath。<br><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></pre></td><td class="code"><pre><span class="line">output: &#123;</span><br><span class="line">  path: webpackConfigBase.resolve(<span class="string">'dist'</span>),</span><br><span class="line">  publicPath: <span class="string">'/__PUBLIC_PATH_PLACEHOLDER__/'</span>,</span><br><span class="line">  filename: <span class="string">'static/js/[name].[chunkhash:8].js'</span></span><br><span class="line">&#125;,</span><br></pre></td></tr></table></figure></p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">"homepage"</span>: <span class="string">"/__PUBLIC_PATH_PLACEHOLDER__"</span>,</span><br></pre></td></tr></table></figure><p><center>四 多环境部署问题</center><br>上面代码中，其实我们使用了大量的变量或者标识，因为我们一个项目会部署到很多环境上面，最开始的想法是在package.json中新建很多script命令，去一一执行，但是太多了，而且你还得每次改Jenkins的打包命令，索性的是每次独立部署每个项目都要重新配置对应的docker-compose.yml文件，那么就想到了，通过docker配置去保存当前环境、打包、目录路径等内容，然后通过shell脚本去替换变量就好了。<br>ps: 环境部署还是得看公司整体的解决方案才行。</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><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">run.sh 文件</span><br><span class="line"></span><br><span class="line">sed -i <span class="string">"s|/__PUBLIC_PATH_PLACEHOLDER__|$BOOT_PUBLIC_PATH|g"</span> /usr/share/nginx/html<span class="comment">/*.html</span></span><br><span class="line"><span class="comment">sed -i "s|/__PUBLIC_PATH_PLACEHOLDER__|$BOOT_PUBLIC_PATH|g" /usr/share/nginx/html/static/css/*.css</span></span><br><span class="line"><span class="comment">sed -i "s|/__PUBLIC_PATH_PLACEHOLDER__|$BOOT_PUBLIC_PATH|g" /usr/share/nginx/html/static/js/*.js</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">exec nginx -g 'daemon off;'</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">在Dockerfile中 执行上面的脚本</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">CMD ["run.sh"]</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">最后在docker-compose.yml文件中，更改对应的路径及配置</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">environment:</span></span><br><span class="line"><span class="comment">    - NGINX_PORT=10021</span></span><br><span class="line"><span class="comment">    - XST_DOMAIN=</span></span><br><span class="line"><span class="comment">    - TZ=Asia/Shanghai</span></span><br><span class="line"><span class="comment">    - BOOT_PUBLIC_PATH=https://xxx.com/</span></span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;center&gt;一 起因&lt;/center&gt;&lt;br&gt;公司项目要给客户独立部署，原来的项目的域名为：&lt;br&gt;&lt;figure class=&quot;highlight javascript&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;
      
    
    </summary>
    
      <category term="Web开发" scheme="https://lijinglun.com/cates/Web%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Web开发" scheme="https://lijinglun.com/tags/Web%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>一个中年人的记录</title>
    <link href="https://lijinglun.com/2023/03/08/%E4%B8%80%E4%B8%AA%E4%B8%AD%E5%B9%B4%E4%BA%BA%E7%9A%84%E8%87%AA%E7%99%BD/"/>
    <id>https://lijinglun.com/2023/03/08/一个中年人的自白/</id>
    <published>2023-03-08T08:37:51.000Z</published>
    <updated>2026-07-24T05:13:05.462Z</updated>
    
    <content type="html"><![CDATA[<center>一</center><p>都说三十而立，过了而立之年就应该有所成就，承担责任，能够有明确的人事目标和方向；我来讲讲我的现状，用两个字概括的话，就是焦虑；<br>焦虑充斥在家庭，工作，生活之中，甚至一度导致我有点抑郁，因为看不到未来，看不到希望，有时候觉得天都是灰色的，有很多烦恼，压力无处去发泄，心态严重的失衡，也证明了我并不是一个内心强大的人，当闭上眼睛脑海里面浮现的都是孩子的教育，孩子的未来，我的工作，我的工资等等，都是一些自己无能为力但是又不停内耗的事。</p><center>二</center><p>没读过万卷书，也没行过万里路，一个普通人，去过的地方屈指可数，一直想真正的潇洒一下，来一场说走就走的旅行，希望能带着我儿子，去看看祖国的大好河山，让他感受一下生活以外的地方是什么样，也增加和孩子的相处时间。           这几年看的书也丰富了起来，不在局限于文学、技术类的，也会看看地理、哲学、经济一类的，希望自己能够保持阅读的习惯，丰富自己的灵魂。</p><center>三</center><p>觉得自己有很多可以改进的地方，比如：沟通，懒惰，耐心，逻辑思维的完善性；觉得自己随着年龄增长，也多了几分不可理喻和放纵，不想去思考，也懒得去思考，后来想想，觉得这是一种逃避现实的方法，百害而无一利；觉得自己虽然面对电脑的时间比面对人的时间还多，但是也不能忘了沟通的重要性，多看一些关于沟通相关的书籍和视频，更重要的是多实战吧。</p><center>结尾</center><p>正视自己，不要逃避，保持良好情绪，适当发泄情绪；不想就这么过完一生；共勉。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;center&gt;一&lt;/center&gt;

&lt;p&gt;都说三十而立，过了而立之年就应该有所成就，承担责任，能够有明确的人事目标和方向；我来讲讲我的现状，用两个字概括的话，就是焦虑；&lt;br&gt;焦虑充斥在家庭，工作，生活之中，甚至一度导致我有点抑郁，因为看不到未来，看不到希望，有时候觉得天都是
      
    
    </summary>
    
      <category term="随笔" scheme="https://lijinglun.com/cates/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="随笔" scheme="https://lijinglun.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>聊聊前端优化</title>
    <link href="https://lijinglun.com/2023/02/24/%E8%81%8A%E8%81%8A%E5%89%8D%E7%AB%AF%E4%BC%98%E5%8C%96/"/>
    <id>https://lijinglun.com/2023/02/24/聊聊前端优化/</id>
    <published>2023-02-24T07:43:35.000Z</published>
    <updated>2026-07-24T05:13:05.461Z</updated>
    
    <content type="html"><![CDATA[<p>随着互联网技术的发展，网页已经不再是简单的静态文档，而是变成了功能丰富、交互复杂、视觉精美的应用程序。然而，这些应用程序也带来了一个挑战：如何在保证功能和体验的同时，让网页快速加载并运行？这就是前端性能优化要解决的问题。</p><p>前端性能优化是一门综合性很强的学科，它涉及到网络、浏览器、JavaScript、CSS、HTML、图片等多个方面。为了达到最佳效果，我们需要从多个角度出发，采用各种技巧和工具来分析、测试、监控和改进网页的性能。</p><p>本文旨在提供一份全面而实用的前端性能优化指南。（本段文字来自chatGPT生成）</p><p><img src="yahoo.jpeg" alt="image"><br>以上来自雅虎优化指南，也叫<a href="https://developer.yahoo.com/performance/rules.html" target="_blank" rel="noopener">雅虎军规</a>。</p><ul><li><h3 id="服务端篇"><a href="#服务端篇" class="headerlink" title="服务端篇"></a>服务端篇</h3><ol><li><p>Content Delivery Network（CDN）</p><p>cdn具有能提高网站的访问速度、节省带宽等优势，其工作原理是通过将源站的内容缓存到分布在不同地区和运营商的边缘节点上，当用户请求时，就近返回节点上缓存的内容。cdn还涉及DNS解析、负载均衡、内容分发、调度等技术模块。</p></li><li><p>浏览器缓存</p><p>缓存的设置可以大大提高响应速度，减少http请求，节省带宽等优势，缓存包括强缓存、协商缓存等，可以添加Expires头，配置ETag等属性来选择缓存的方式。当浏览器请求一个资源时，它会检测本地缓存中是否有该资源，并且是否在有效期内，如果是，则直接从本地缓存中返回该资源。</p><ul><li><p>强缓存是利用HTTP请求头中的Expires和Cache-Control 两个字段来进行控制，用来表示资源的缓存时间，Expires是一个绝对时间，Cache-Control 是一个相对时间，表示资源在多长时间内有效；一般会对js、css、图片等资源使用强缓存。</p></li><li><p>协商缓存是利用 HTTP 请求头中的 Last-Modified/If-Modified-Since 和 ETag/If-None-Match 两对字段来进行控制，用来表示资源的更新时间和唯一标识。</p><p>当浏览器再次请求一个资源时，如果本地缓存已经过期，它会携带这些字段向服务器发送请求，询问资源是否有更新。如果没有更新，则服务器会返回 304 状态码，告诉浏览器可以继续使用本地缓存。如果有更新，则服务器会返回 200 状态码和新的资源，并更新本地缓存。</p></li></ul></li><li><p>AppCache</p><ul><li><p>在html页面中指定manifest文件的路径，例如<code>&lt;html manifest=&quot;example.appcache&quot;&gt;</code></p></li><li><p>在manifest文件中列出需要缓存的资源，以及在离线时显示的页面，例如：</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">CACHE MANIFEST</span><br><span class="line"># v1.0.0</span><br><span class="line"></span><br><span class="line">CACHE:</span><br><span class="line">index.html</span><br><span class="line">style.css</span><br><span class="line">script.js</span><br><span class="line">logo.png</span><br><span class="line"></span><br><span class="line">NETWORK:</span><br><span class="line">*</span><br><span class="line"></span><br><span class="line">FALLBACK:</span><br><span class="line">/ offline.html</span><br></pre></td></tr></table></figure></li><li><p>在服务器端配置正确的MIME类型，例如<code>text/cache-manifest</code></p></li><li><p>在浏览器中访问html页面，浏览器会自动下载并缓存manifest文件中指定的资源</p></li><li><p>在离线时，浏览器会从缓存中加载资源，并在无法访问的情况下显示fallback页面</p></li></ul></li><li><p>Localstorge、Sessionstorage、Cookie、CacheStorage</p><p>用于本地存储，常用，不必过多解释。</p></li><li><p>减少请求数</p><ul><li>小图片合并雪碧图；</li><li>避免重复的资源请求。减少请求数</li></ul></li><li><p>减少文件大小，节省请求带宽</p><ul><li>压缩CSS、JS、图片；</li><li>尽可能控制DOM节点数；</li><li>精简css、 JavaScript，移除注释、空格、重复css和脚本。</li><li>开启Gzip，Gzip的思想就是把文件先在服务器端进行压缩，且压缩率达到85%，然后再传输，传输完毕后浏览器会重新对压缩过的内容进行解压缩，并执行。。好处在于Gzip的支持已经很好，且爬虫可识别，压缩率达到66%-85%显著减少了文件传输的大小。另外，gzip对pdf文件的压缩效果不大，而且会浪费CPU。</li></ul></li><li><p>静态资源域名</p><p>域名的要求一般是独立短小，短小可以减少头部开销，域名越短请求头的URI就越短；独立是因为独立的域名不会共享主域的cookie，可以减少请求头大小，还有一个原因是浏览器对相同域名的并发连接数是有限制的，一般同域名为6-8个连接，当然域名不是越多越好，每个域名的第一次连接都要经理DNS查询，会耗费时间，尽量控制域名在2-4个间，需要注意的是，同一静态资源在不同页面散列到不同子域下，会导致无法利用http缓存。</p></li><li><p>http2（来源：baidu.com）</p><ul><li>多路复用：多路复用很好地解决如何让重要资源尽快加载这个问题。同域名下或者不同域但是同时满足同一个 IP以及使用同一个证书的这两个条件中的所有通信都在<strong>单个连接</strong>上完成，此连接上同时打开任意数量的双向数据流（ HTTP 1.1 有连接数限制）。使用多域名加上相同的 IP 和证书部署 Web 服务有特殊的意义：让支持 HTTP/2 的终端只建立一个连接，用上 HTTP/2 协议带来的各种好处；而只支持 HTTP/1.1 的终端则会建立多个连接，达到同时更多并发请求的目的。（来源：baidu.com）</li><li>HEAD压缩：HTTP/2 将请求和响应数据分割为更小的帧，并对它们采用二进制编码（ Binary Framing ）。在 HTTP/1 中，HTTP 请求和响应都是由「状态行、请求 / 响应头部、消息主体」三部分组成，状态行和头部却没有经过任何压缩，直接以纯文本传输。在 HTTP/2 中，每个数据流都以消息的形式发送，而消息又由一个或多个帧组成。多个帧之间可以乱序发送，因为根据帧首部的流标识可以重新组装。</li><li>请求优先级：服务器可以根据流的优先级，控制资源分配(CPU、内存、带宽)，而在响应数据准备好之后，优先将最高优先级的帧发送给客户端。</li><li>服务器推送：启动Server Push，意味着服务端可以在发送页面HTML时主动推送其它资源，有自己独立的URL，可以被浏览器缓存；如果服务端推送的资源已经被浏览器缓存过，浏览器可以通过发送 RST_STREAM 帧来拒收。</li></ul></li></ol></li><li><h3 id="客户端篇"><a href="#客户端篇" class="headerlink" title="客户端篇"></a>客户端篇</h3><ol><li><p>使用外链CSS和JS，CSS放头，JS放尾，防止阻塞以减少对并发下载的影响，尽早刷新文档的输出。</p></li><li><p>html的代码优化，如：</p><ul><li>避免空的图片src；</li><li>协议自适应，减少html文件大小，将https://和http://都替换成//。</li></ul></li><li><p>css的代码优化，如：</p><ul><li>建议使用类选择器，访问比较快；</li><li>不建议使用很长的base64；</li><li>避免CSS表达式；</li><li>避免使用Filters。</li></ul></li><li><p>js的代码优化，如：</p><ul><li>避免使用eval和width；</li><li>减少作用域链查找；</li><li>减少DOM访问，尽量缓存DOM；</li><li>充分利用事件委托；</li><li>减少Repaint（重绘）和Reflow（重排）最好通过批量更新元素减少重排次数，如设置类class统一更新样式，在添加多个li</li><li>元素将会触发多次页面重排的情况下使用 DOM fargment 在内存中创建完整的 DOM 节点，然后再一次性添加到 DOM 中。</li></ul></li><li><p>图片格式的选择：</p><ul><li>颜色较为丰富的图片而且文件比较大的（40KB - 200KB）或者有内容的图片优先考虑 jpg；图标等颜色比较简单、文件体积不大、起修饰作用的图片，优先考虑使用 PNG8 格式；图像颜色丰富而且图片文件不太大的（40KB 以下）或有半透明效果的优先考虑 PNG24 格式。</li><li>条件允许的，使用新格式WEBP和BPG。</li><li>用SVG和ICONFONT代替简单的图标。</li></ul></li><li><p>合理分配资源加载时间，按需加载，包括CSS、JS文件以及图片、业务模块等。 根据我们网页最初加载需要的最小内容集推断其他内容延迟加载；无条件提前加载公共内容或根据用户行为推断提前加载某些内容，如根据搜索框输入的文字来判断加载的内容。加载机制如下：</p><ul><li>预加载</li><li>Dom Ready后加载</li><li>onLoad后加载</li><li>滚动加载</li></ul></li><li><p>减少DNS 查询：DNS 查询一般需要几毫秒到几百毫秒，移动环境下会更慢。我们可以预先读取DNS，减少用户等待时间。</p><p><img src="prefetch.png" alt></p></li></ol></li></ul><p>   更多代码规范相关，请参考： <a href="http://standard.lijinglun.com/" target="_blank" rel="noopener">前端代码规范</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;随着互联网技术的发展，网页已经不再是简单的静态文档，而是变成了功能丰富、交互复杂、视觉精美的应用程序。然而，这些应用程序也带来了一个挑战：如何在保证功能和体验的同时，让网页快速加载并运行？这就是前端性能优化要解决的问题。&lt;/p&gt;
&lt;p&gt;前端性能优化是一门综合性很强的学科，它
      
    
    </summary>
    
      <category term="性能优化" scheme="https://lijinglun.com/cates/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"/>
    
    
      <category term="Web开发" scheme="https://lijinglun.com/tags/Web%E5%BC%80%E5%8F%91/"/>
    
      <category term="性能优化" scheme="https://lijinglun.com/tags/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>antd中表单自定义组件如何获取值</title>
    <link href="https://lijinglun.com/2023/02/22/%E8%A1%A8%E5%8D%95%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6/"/>
    <id>https://lijinglun.com/2023/02/22/表单自定义组件/</id>
    <published>2023-02-22T07:43:35.000Z</published>
    <updated>2026-07-24T05:13:05.461Z</updated>
    
    <content type="html"><![CDATA[<p>页面中有大量的form表单，但是不是所有的自定义表单都能满足我们的需求，很有可能需要自定义组件去解决问题，那么自定义组件如何获取antd的value值呢？<br><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><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123; Form, Input &#125; <span class="keyword">from</span> <span class="string">'antd'</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; useEffect &#125; <span class="keyword">from</span> <span class="string">'react'</span>;</span><br><span class="line"> </span><br><span class="line"><span class="keyword">const</span> App = <span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> [form]= Form.useForm();</span><br><span class="line">   </span><br><span class="line">  useEffect(<span class="function"><span class="params">()</span> =&gt;</span> &#123;</span><br><span class="line">    form.setFieldsValue(&#123;</span><br><span class="line">      a: &#123;</span><br><span class="line">        b: &#123;</span><br><span class="line">          c: <span class="string">'ccc'</span></span><br><span class="line">        &#125;</span><br><span class="line">      &#125;,</span><br><span class="line">      d: &#123;</span><br><span class="line">        e : <span class="string">'eee'</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><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">    &lt;Form form=&#123;form&#125;&gt;</span><br><span class="line">      &lt;Form.Item name=&#123;[<span class="string">'d'</span>, <span class="string">'e'</span>]&#125;&gt;</span><br><span class="line">        &lt;Input/&gt;</span><br><span class="line">      &lt;<span class="regexp">/Form.Item&gt;</span></span><br><span class="line"><span class="regexp">    &lt;/</span>Form&gt;</span><br><span class="line">  )</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> App;</span><br></pre></td></tr></table></figure></p><p>这代码熟悉吧！是不是经常写？</p><p>这是 antd 的 Form 组件的用法：</p><p>通过 useForm 拿到 form 对象，设置到 Form 组件里，然后用 form.setFieldsValue 设置的字段值就能在 Form.Item 里取到。</p><p>Form.Item 只需要在 name 里填写字段所在的路径就行，也就是 [‘d’, ‘e’] 这个。</p><p>有的同学可能会问了，为啥这里只设置了个 name，它下面的 Input 就有值了呢？</p><p>我们让 Form.Item 渲染一个自定义的组件试一下，比如这样：</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> MyInput = <span class="function">(<span class="params">props</span>) =&gt;</span>&#123;</span><br><span class="line">    <span class="keyword">return</span> &lt;div&gt;</span><br><span class="line">    &lt;Input&gt;</span><br><span class="line">    &lt;/div&gt;   </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">return</span> (</span><br><span class="line">  &lt;Form form=&#123;form&#125;&gt;</span><br><span class="line">    &lt;Form.Item name=&#123;[<span class="string">'d'</span>, <span class="string">'e'</span>]&#125;&gt;</span><br><span class="line">      &lt;MyInput/&gt;</span><br><span class="line">    &lt;<span class="regexp">/Form.Item&gt;</span></span><br><span class="line"><span class="regexp">  &lt;/</span>Form&gt;</span><br><span class="line">)</span><br></pre></td></tr></table></figure><p>通过给自定义组件打断点，可以看到，组件内部传入了 id、value、onChange 等参数进来，</p><p>这就是为啥 Input 能有值，因为传入了 value 参数。</p><p>而且变化了也能同步到 fields，因为传入了 onChange 参数。</p><p>有的时候我们要对保存的值做一些修改，就可以这样写：</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">MyInput</span>(<span class="params">props</span>) </span>&#123;</span><br><span class="line">    <span class="keyword">const</span> &#123; value, onChange &#125; = props;</span><br><span class="line">    <span class="built_in">console</span>.log(form.getFieldsValue())</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">onValueChange</span>(<span class="params">event</span>) </span>&#123;</span><br><span class="line">      onChange(event.target.value.toUpperCase());</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> &lt;Input value=&#123;value&#125; onChange=&#123;onValueChange&#125;&gt;&lt;/Input&gt;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>所以说，Form.Item 会给子组件传入 value、onChange 参数用来设置值和接受值的改变，同步到 form 的 fields。</p><p>以下是我个人经常使用的上传图片的组件：<br><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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> React, &#123; useEffect, useState &#125; <span class="keyword">from</span> <span class="string">'react'</span></span><br><span class="line"><span class="keyword">import</span> &#123; message, Upload &#125; <span class="keyword">from</span> <span class="string">"antd"</span>;</span><br><span class="line"><span class="keyword">import</span> &#123; LoadingOutlined, PlusOutlined &#125; <span class="keyword">from</span> <span class="string">"@ant-design/icons"</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> defaultUrl = <span class="string">""</span></span><br><span class="line"><span class="keyword">const</span> imageURL = <span class="string">""</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> UploadImg = <span class="function">(<span class="params">props: any</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> &#123;value, onChange&#125; = props;</span><br><span class="line">  <span class="keyword">const</span> [loading, setLoading] = useState(<span class="literal">false</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">  <span class="keyword">const</span> handleChange = <span class="function">(<span class="params">info: any</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">if</span> (info.file.status === <span class="string">"uploading"</span>) &#123;</span><br><span class="line">      setLoading(<span class="literal">true</span>);</span><br><span class="line">      <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (info.file.status === <span class="string">"done"</span>) &#123;</span><br><span class="line">      <span class="keyword">const</span> url = info.file.response.data.url;</span><br><span class="line">      onChange &amp;&amp; onChange(url);</span><br><span class="line">      setLoading(<span class="literal">false</span>);</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">  <span class="keyword">const</span> beforeUpload = <span class="function">(<span class="params">file: any</span>) =&gt;</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> isJpgOrPng = file.type === <span class="string">"image/jpeg"</span> || file.type === <span class="string">"image/png"</span>;</span><br><span class="line">    <span class="keyword">if</span> (!isJpgOrPng) &#123;</span><br><span class="line">      message.error(<span class="string">"只支持 JPG/PNG 文件!"</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">const</span> isLt2M = file.size / <span class="number">1024</span> / <span class="number">1024</span> &lt; <span class="number">5</span>;</span><br><span class="line">    <span class="keyword">if</span> (!isLt2M) &#123;</span><br><span class="line">      message.error(<span class="string">"图片必须小于5MB!"</span>)</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> isJpgOrPng &amp;&amp; isLt2M;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> (</span><br><span class="line">      &lt;Upload</span><br><span class="line">        name=<span class="string">"file"</span></span><br><span class="line">        <span class="comment">// customRequest=&#123;customRequest&#125;</span></span><br><span class="line">        listType=<span class="string">"picture-card"</span></span><br><span class="line">        className=<span class="string">"avatar-uploader"</span></span><br><span class="line">        showUploadList=&#123;<span class="literal">false</span>&#125;</span><br><span class="line">        action=&#123;defaultUrl&#125;</span><br><span class="line">        beforeUpload=&#123;beforeUpload&#125;</span><br><span class="line">        onChange=&#123;handleChange&#125;</span><br><span class="line">      &gt;</span><br><span class="line">        &#123;value ? (</span><br><span class="line">          &lt;img src=&#123;imageURL + value&#125; alt=<span class="string">"avatar"</span> style=&#123;&#123; <span class="attr">width</span>: <span class="string">"100%"</span> &#125;&#125; /&gt;</span><br><span class="line">        ) : (</span><br><span class="line">          &lt;div&gt;</span><br><span class="line">            &#123;loading ? &lt;LoadingOutlined /&gt; : &lt;PlusOutlined /&gt;&#125;</span><br><span class="line">            &lt;div style=&#123;&#123; <span class="attr">marginTop</span>: <span class="number">8</span> &#125;&#125;&gt;点击上传&lt;<span class="regexp">/div&gt;</span></span><br><span class="line"><span class="regexp">          &lt;/</span>div&gt;</span><br><span class="line">        )&#125;</span><br><span class="line">      &lt;<span class="regexp">/Upload&gt;</span></span><br><span class="line"><span class="regexp">  )</span></span><br><span class="line"><span class="regexp">&#125;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">export default UploadImg</span></span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;页面中有大量的form表单，但是不是所有的自定义表单都能满足我们的需求，很有可能需要自定义组件去解决问题，那么自定义组件如何获取antd的value值呢？&lt;br&gt;&lt;figure class=&quot;highlight javascript&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td clas
      
    
    </summary>
    
      <category term="react开发" scheme="https://lijinglun.com/cates/react%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Web开发" scheme="https://lijinglun.com/tags/Web%E5%BC%80%E5%8F%91/"/>
    
      <category term="react开发" scheme="https://lijinglun.com/tags/react%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>Phaser游戏开发2</title>
    <link href="https://lijinglun.com/2018/05/03/Phaser%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%912/"/>
    <id>https://lijinglun.com/2018/05/03/Phaser游戏开发2/</id>
    <published>2018-05-03T07:45:09.000Z</published>
    <updated>2026-07-24T05:13:05.460Z</updated>
    
    <content type="html"><![CDATA[<p>Phaser游戏开发2；</p><p>上面的代码已经完成了80%的内容，下面让我们来继续完善游戏内容；</p><h3 id="碰撞检测"><a href="#碰撞检测" class="headerlink" title="碰撞检测"></a>碰撞检测</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">game.physics.arcade.collide(player, platforms);</span><br></pre></td></tr></table></figure><p>Phaser.Physics.arcade.collide(object1, object2, collideCallback, processCallback, callbackContext)</p><p>参数分别为，对象1，对象2，碰撞回调函数，比如有的关卡，有陷阱一类的，人物要是碰撞后，在回调中kill人物，state跳到over上。</p><h3 id="重叠检测"><a href="#重叠检测" class="headerlink" title="重叠检测"></a>重叠检测</h3><p>跟碰撞类似，只是api不同<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">game.physics.arcade.overlap(player, platforms);</span><br></pre></td></tr></table></figure></p><p>Phaser.Physics.arcade.overlap(object1, object2, collideCallback, processCallback, callbackContext)</p><p>多用在获得道具上，比如人物和星星重叠后，可以加分，然后消除星星。</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></pre></td><td class="code"><pre><span class="line">game.physics.arcade.overlap(player,stars,<span class="function"><span class="keyword">function</span> (<span class="params">player,star</span>) </span>&#123;</span><br><span class="line">   scroe += <span class="number">10</span>;</span><br><span class="line">   fonts.text = <span class="string">'scroe: '</span> + scroe;</span><br><span class="line">   star.kill();</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 plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cursors = game.input.keyboard.createCursorKeys();</span><br></pre></td></tr></table></figure><p>Phaser.Game.input.keyboard.createCursorKeys()</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span>(cursors.left.isDown)&#123;</span><br><span class="line">    player.body.velocity.x = <span class="number">-150</span>;</span><br><span class="line">    player.animations.play(<span class="string">'left'</span>);</span><br><span class="line">&#125;<span class="keyword">else</span> <span class="keyword">if</span>(cursors.right.isDown)&#123;</span><br><span class="line">    player.body.velocity.x = <span class="number">150</span>;</span><br><span class="line">    player.animations.play(<span class="string">'right'</span>);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    player.frame = <span class="number">4</span>;</span><br><span class="line">    player.body.velocity.x = <span class="number">0</span>;</span><br><span class="line">    player.animations.stop();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当按下键盘 &lt;- 左键时，x轴加速为-150，然后执行animations的left动画，有一点是需要注意的是，在没有按下左右键的时候，让frame定格在第4帧，<br><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">player.frame = <span class="number">4</span>;</span><br></pre></td></tr></table></figure></p><p>以下为全部代码：<br>Phaser 小游戏<a href="/2018/05/03/Phaser游戏开发2/phaser1.zip">About</a>。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Phaser游戏开发2；&lt;/p&gt;
&lt;p&gt;上面的代码已经完成了80%的内容，下面让我们来继续完善游戏内容；&lt;/p&gt;
&lt;h3 id=&quot;碰撞检测&quot;&gt;&lt;a href=&quot;#碰撞检测&quot; class=&quot;headerlink&quot; title=&quot;碰撞检测&quot;&gt;&lt;/a&gt;碰撞检测&lt;/h3&gt;&lt;figu
      
    
    </summary>
    
      <category term="游戏开发" scheme="https://lijinglun.com/cates/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Phaser" scheme="https://lijinglun.com/tags/Phaser/"/>
    
      <category term="游戏开发" scheme="https://lijinglun.com/tags/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>Phaser游戏开发1</title>
    <link href="https://lijinglun.com/2018/04/27/Phaser%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    <id>https://lijinglun.com/2018/04/27/Phaser游戏开发/</id>
    <published>2018-04-27T09:06:30.000Z</published>
    <updated>2026-07-24T05:13:05.459Z</updated>
    
    <content type="html"><![CDATA[<p>最近开发基于微信分享的h5小游戏，之前试用createJs，觉得想换个游戏引擎试试，所以找到了Phaser，基于pixi，内置了物理引擎，动画等。</p><h3 id="初始化"><a href="#初始化" class="headerlink" title="初始化"></a>初始化</h3><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> game = <span class="keyword">new</span> Phaser.Game(<span class="number">288</span>,<span class="number">505</span>,Phaser.AUTO,<span class="string">'game'</span>,state); </span><br><span class="line"><span class="keyword">var</span> game = <span class="keyword">new</span> Phaser.Game(<span class="number">288</span>,<span class="number">505</span>,Phaser.AUTO,<span class="string">'game'</span>,&#123;<span class="attr">proload</span>:proload,<span class="attr">create</span>:create&#125;);</span><br><span class="line"></span><br><span class="line">Phaser.Game(width, height, renderer, parent, state, transparent, antialias, physicsConfig)</span><br><span class="line">width: 游戏场景的宽度，单位为px</span><br><span class="line">height: 高度，</span><br><span class="line">renderer: 渲染方式，有Phaser.CANVAS，Phaser.WebGL，Phaser.AUTO，auto是自动识别</span><br><span class="line">parent: 用来放置canvas元素的父元素，可以是一个元素id，也可以是dom元素本身，phaser会自动创建一个canvas并插入到这个元素中</span><br><span class="line">state: 场景，通常会有（init，proload，create，update等）</span><br></pre></td></tr></table></figure><p>state 是一个场景，可以是一个对象，也可以是一个构造函数，只要存在proload、create、update中的一个，就是一个合法的state；</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><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">//state可以是一个自定义对象</span></span><br><span class="line"><span class="keyword">var</span> state1 = &#123;</span><br><span class="line">    preload : <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123; &#125;,</span><br><span class="line">    create : <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123; &#125;,</span><br><span class="line">    update : <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123; &#125;    </span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//state也可以是一个构造函数</span></span><br><span class="line"><span class="keyword">var</span> state2 = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">    <span class="keyword">this</span>.preload = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123; &#125;;</span><br><span class="line">    <span class="keyword">this</span>.create = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123; &#125;;</span><br><span class="line">    <span class="keyword">this</span>.update = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123; &#125;;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//state里面可以存在其他的方法，和属性</span></span><br><span class="line"><span class="comment">//state里面只要存一个proload、create、update中一个即可</span></span><br><span class="line"><span class="keyword">var</span> state3 = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">    <span class="keyword">this</span>.aaa = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;&#125;;</span><br><span class="line">    <span class="keyword">this</span>.bbb = <span class="string">'first'</span>;</span><br><span class="line">    <span class="keyword">this</span>.create=<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="加载资源"><a href="#加载资源" class="headerlink" title="加载资源"></a>加载资源</h3><p>proload函数是最先执行的，用来加载资源、create是初始化场景的函数，等proload执行完成后执行，update是更新函数，游戏每一帧都要执行update；</p><figure class="highlight plain"><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">function state() &#123;</span><br><span class="line">    //加载资源</span><br><span class="line">    this.preload = function () &#123;</span><br><span class="line">        // load img and 精灵</span><br><span class="line">        game.load.image(&quot;sky&quot;, &apos;assets/sky.png&apos;);</span><br><span class="line">        game.load.image(&quot;platform&quot;, &apos;assets/platform.png&apos;);</span><br><span class="line">        game.load.image(&quot;star&quot;, &apos;assets/star.png&apos;);</span><br><span class="line">        game.load.spritesheet(&apos;dude&apos;, &quot;assets/dude.png&quot;, 32, 48);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用方法为:<br>game.load.’资源’(‘别名’,’路径’)；<br>常用的资源有：image、audio、tilemap、text、spritesheet；<br>别名指后面用的名称；<br>其中spritesheet还需要添加每帧的宽高帧数等。</p><h3 id="初始界面"><a href="#初始界面" class="headerlink" title="初始界面"></a>初始界面</h3><p>资源加载完成后，会自动进入create函数<br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">this</span>.create = <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">    game.add.sprite(<span class="number">0</span>,<span class="number">0</span>,<span class="string">'sky'</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>sprite对象，也叫精灵，可以用图片来创建精灵，然后用phaser提供的属性，来操作。<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">game.add.sprite(<span class="number">0</span>,<span class="number">0</span>,<span class="string">'sky'</span>)</span><br></pre></td></tr></table></figure></p><p>创建后，会自动添加对应的内容在主界面。<br>说一个比较重要的对象：Phaser.group(),也就是组，相当于一个统一一个父容器，把需要的子对象放进去，然后可以通过组的方法进行批量的操作，比如统一的位移和碰撞检测等。<br><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></pre></td><td class="code"><pre><span class="line">platforms = game.add.group();</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> ground = platforms.create(<span class="number">0</span>,<span class="number">0</span>,<span class="string">'platform'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> ledge = platforms.create(<span class="number">400</span>,<span class="number">200</span>,<span class="string">'platform'</span>);</span><br></pre></td></tr></table></figure></p><h3 id="物理引擎"><a href="#物理引擎" class="headerlink" title="物理引擎"></a>物理引擎</h3><p>Phaser已支持一些不同的物理系统，有Arcade Physics,，Ninja Physics 和 P2.JS Full-Body Physics。对与简单的物理方法，我们使用Arcade Physics即可。<br>物理引擎在Phaser中是默认关闭的，要启用可以在create中使用：<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">game.physics.startSystem(Phaser.Physics.ARCADE);</span><br></pre></td></tr></table></figure></p><p>要启用整组的物理属性，使用enableBody即可<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">platforms.enableBody = <span class="literal">true</span>;</span><br></pre></td></tr></table></figure></p><p>开启物理属性后，即可得到一个body属性，所有的物理属性方法都挂在body上面<br>常用的属性有：<br>immovable、bounce、gravity、drag、sprite、x、y、collideWorldBounds、input等，对应各种固定，弹性、重力，拖拽，边界等。</p><figure class="highlight javascript"><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">ground.body.immovable = <span class="literal">true</span>;</span><br><span class="line">legs.body.immovable = <span class="literal">true</span>;</span><br></pre></td></tr></table></figure><figure class="highlight plain"><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">player.animations.add(&apos;left&apos;, [0, 1, 2, 3], 10, true);</span><br><span class="line">player.animations.add(&apos;right&apos;, [5, 6, 7, 8], 10, true);</span><br></pre></td></tr></table></figure><p>TileSprite、Rope、Image、Button、Sprite等拥有animations属性，可以添加动画方法<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Phaser.Sprite.animations.add(name, frames, frameRate, loop, useNumericIndex)</span><br></pre></td></tr></table></figure></p><p>分别为动画名称，帧数数组，每秒帧数，循环次数；</p><h3 id="添加文字"><a href="#添加文字" class="headerlink" title="添加文字"></a>添加文字</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">game.add.text(<span class="number">10</span>,<span class="number">10</span>,<span class="string">'score:0'</span>,&#123; <span class="attr">font</span>: <span class="string">"35px Arial"</span>, <span class="attr">fill</span>: <span class="string">"#ff0044"</span>&#125;)</span><br></pre></td></tr></table></figure><p>//Phaser.Game.add.text(x, y, text, style, group);<br>如果你经常使用canvas的话，对这种应该不陌生，分别为：x、y、文字内容，样式组。</p><p>这样我们基本完成了create函数的内容：<br><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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">this</span>.create=<span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">        <span class="comment">//开启物理引擎</span></span><br><span class="line">        game.physics.startSystem(Phaser.Physics.ARCADE);</span><br><span class="line">        <span class="comment">//添加天空</span></span><br><span class="line">        game.add.sprite(<span class="number">0</span>, <span class="number">0</span>, <span class="string">'sky'</span>);</span><br><span class="line">        <span class="comment">//添加地板组</span></span><br><span class="line">        platforms = game.add.group();</span><br><span class="line">        <span class="comment">//开启地板组的物理属性</span></span><br><span class="line">        platforms.enableBody = <span class="literal">true</span>;</span><br><span class="line">        <span class="comment">//添加底部地板</span></span><br><span class="line">        <span class="keyword">var</span> grounds = platforms.create(<span class="number">0</span>,game.world.height<span class="number">-32</span>,<span class="string">'platform'</span>);</span><br><span class="line">        <span class="comment">//设置缩放</span></span><br><span class="line">        grounds.scale.setTo(<span class="number">2</span>,<span class="number">1</span>);</span><br><span class="line">        <span class="comment">//禁止移动</span></span><br><span class="line">        grounds.body.immovable = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">var</span> legs = platforms.create(<span class="number">-150</span>,<span class="number">120</span>,<span class="string">'platform'</span>);</span><br><span class="line">        legs.body.immovable = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">        legs = platforms.create(<span class="number">400</span>,<span class="number">270</span>,<span class="string">'platform'</span>);</span><br><span class="line">        legs.body.immovable = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">        <span class="comment">//添加人物</span></span><br><span class="line">        player = game.add.sprite(<span class="number">32</span>, <span class="number">150</span>, <span class="string">'dude'</span>);</span><br><span class="line">        game.physics.arcade.enable(player);</span><br><span class="line"></span><br><span class="line">        player.body.bounce.y = <span class="number">0.3</span>;</span><br><span class="line">        player.body.gravity.y = <span class="number">500</span>;</span><br><span class="line">        player.body.collideWorldBounds = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">        player.animations.add(<span class="string">'left'</span>, [<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>], <span class="number">10</span>, <span class="literal">true</span>);</span><br><span class="line">        player.animations.add(<span class="string">'right'</span>, [<span class="number">5</span>, <span class="number">6</span>, <span class="number">7</span>, <span class="number">8</span>], <span class="number">10</span>, <span class="literal">true</span>);</span><br><span class="line"></span><br><span class="line">        cursors = game.input.keyboard.createCursorKeys();</span><br><span class="line"></span><br><span class="line">        <span class="comment">//添加文字</span></span><br><span class="line">        fonts = game.add.text(<span class="number">10</span>,<span class="number">10</span>,<span class="string">'score:0'</span>,&#123; <span class="attr">font</span>: <span class="string">"35px Arial"</span>, <span class="attr">fill</span>: <span class="string">"#ff0044"</span>&#125;)</span><br><span class="line">        <span class="comment">//添加星星</span></span><br><span class="line">        stars = game.add.group();</span><br><span class="line">        stars.enableBody = <span class="literal">true</span>;</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">var</span> i =<span class="number">0</span>;i&lt;<span class="number">12</span>;i++)&#123;</span><br><span class="line">           <span class="keyword">var</span> star = stars.create(i * <span class="number">70</span> , <span class="number">0</span>, <span class="string">'star'</span>);</span><br><span class="line">           star.body.bounce.y = <span class="number">0.7</span>;</span><br><span class="line">           star.body.gravity.y = <span class="number">400</span>;</span><br><span class="line">           star.body.collideWorldBounds = <span class="literal">true</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;最近开发基于微信分享的h5小游戏，之前试用createJs，觉得想换个游戏引擎试试，所以找到了Phaser，基于pixi，内置了物理引擎，动画等。&lt;/p&gt;
&lt;h3 id=&quot;初始化&quot;&gt;&lt;a href=&quot;#初始化&quot; class=&quot;headerlink&quot; title=&quot;初始化&quot;&gt;
      
    
    </summary>
    
      <category term="游戏开发" scheme="https://lijinglun.com/cates/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Phaser" scheme="https://lijinglun.com/tags/Phaser/"/>
    
      <category term="游戏开发" scheme="https://lijinglun.com/tags/%E6%B8%B8%E6%88%8F%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>iTerm2 免密登录 SSH 的方法</title>
    <link href="https://lijinglun.com/2018/04/27/%E7%99%BB%E5%BD%95/"/>
    <id>https://lijinglun.com/2018/04/27/登录/</id>
    <published>2018-04-27T06:50:59.000Z</published>
    <updated>2026-07-24T05:13:05.459Z</updated>
    
    <content type="html"><![CDATA[<p>大家都知道使用iTerm2连接shh 使用命令 ssh -p22 <a href="mailto:root@129.10.10.1" target="_blank" rel="noopener">root@129.10.10.1</a>，然后输入密码即可。但是对于我们的服务器或者测试服务器，每次都这么手动ssh连接太慢了而且麻烦，我们可以考虑使用比较快捷的方式去连接的。</p><p>1、在~/.ssh下，新建文件，比如login，或者test1等；<br><img src="1.png" alt="css"><br>2、<br><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/usr/bin/expect -f</span></span><br><span class="line"><span class="keyword">set</span> user root</span><br><span class="line"><span class="keyword">set</span> host 192.168.1.109</span><br><span class="line"><span class="keyword">set</span> password test123###</span><br><span class="line"><span class="keyword">set</span> timeout -1</span><br><span class="line"></span><br><span class="line">spawn ssh $user@$host</span><br><span class="line">expect "*assword:*"</span><br><span class="line">send "$password\r"</span><br><span class="line">interact</span><br><span class="line">expect eof</span><br></pre></td></tr></table></figure></p><p>3、如果是其他的端口，在set一个port xxxx，xxxx对应你的端口；<br>4、打开iterm2的Profiles，点击+号，新增一个profile，name写自己连接主机的名称，然后在command上选择command，把：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">expect ~/.ssh/login</span><br></pre></td></tr></table></figure></p><p>后面的login对应你建立的文件名称<br>5、使用的时候，直接在iterm2上面的Profiles选择你填写的用户名即可。<br><img src="2.png" alt="css"></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;大家都知道使用iTerm2连接shh 使用命令 ssh -p22 &lt;a href=&quot;mailto:root@129.10.10.1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;root@129.10.10.1&lt;/a&gt;，然后输入密码即可。但是对于我们的服务
      
    
    </summary>
    
      <category term="Web开发" scheme="https://lijinglun.com/cates/Web%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="iterm2配置" scheme="https://lijinglun.com/tags/iterm2%E9%85%8D%E7%BD%AE/"/>
    
      <category term="ssh" scheme="https://lijinglun.com/tags/ssh/"/>
    
  </entry>
  
  <entry>
    <title>新年新展望</title>
    <link href="https://lijinglun.com/2018/01/15/%E6%96%B0%E5%B9%B4%E6%96%B0%E5%B1%95%E6%9C%9B/"/>
    <id>https://lijinglun.com/2018/01/15/新年新展望/</id>
    <published>2018-01-15T07:12:32.000Z</published>
    <updated>2026-07-24T05:13:05.458Z</updated>
    
    <content type="html"><![CDATA[<p>“又是一年芳草绿,春风十里杏花香”<br>总结一下去年的自己，去年自己算是挺圆满的了，结了个婚，换了份工作，虽然不是什么大人物，但是小人物也有小人物的幸福，挺知足的。<br>去年自己成功的把vueJs引入上家公司，并完成了前后端的完全分离，极大的解放了生产力和提高了效率，并使得公司绝大部分人都学习了vue及nodejs，<br>并使用vue开发了3、4个大型的项目，对vue也算是从熟悉到理解，并能够把element-ui中的组件重写或者更改；项目中也使用了很多ES6的语法，对<br>ES6也算是很熟悉了吧。看了将近20本左右的书籍，其中文学读物（金庸、古龙、梁羽生、四大名著、<del>网络小说</del>）占比一半，技术书籍（js、python、nodejs、css）占一半，总体来说，看书的收获还是挺大的，希望自己有一天也能出书。</p><p><img src="1.jpeg" width="500px"></p><p>又是一年的开始，做个今年的计划吧！<br>1、写完自己的vueUI组件，传说中的Lui，哈哈<br>2、写go程序或者python，毕竟很久没写了<br>3、写一款自己的小游戏<br>4、精通typescript<br>5、看完10左右的技术书籍</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;“又是一年芳草绿,春风十里杏花香”&lt;br&gt;总结一下去年的自己，去年自己算是挺圆满的了，结了个婚，换了份工作，虽然不是什么大人物，但是小人物也有小人物的幸福，挺知足的。&lt;br&gt;去年自己成功的把vueJs引入上家公司，并完成了前后端的完全分离，极大的解放了生产力和提高了效率，并
      
    
    </summary>
    
      <category term="随笔" scheme="https://lijinglun.com/cates/%E9%9A%8F%E7%AC%94/"/>
    
    
      <category term="随笔" scheme="https://lijinglun.com/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>canvas压缩图片</title>
    <link href="https://lijinglun.com/2017/08/06/canvas%E5%8E%8B%E7%BC%A9%E5%9B%BE%E7%89%87/"/>
    <id>https://lijinglun.com/2017/08/06/canvas压缩图片/</id>
    <published>2017-08-06T10:45:41.000Z</published>
    <updated>2026-07-24T05:13:05.456Z</updated>
    
    <content type="html"><![CDATA[<p>最近遇到了图片压缩的问题，想在前端控制一下，所以有了一下代码。<br><a id="more"></a><br>一.canvas.toDataURL()</p><p>具体使用方法为：canvas.toDataURL(type,encoderOptions)</p><p>第一个参数type为，支持的类型，默认为images/png，第二个参数是质量，默认为0.92</p><ul><li>注意事项：<ul><li>1、图片跨域问题</li><li>2、画布高度为0，会返回字符串”data:,”</li><li>3、图片类型，如：image/png、image/jpeg、image/webp</li><li>4、图片质量如为默认，则小心压缩的图片质量很有可能比原有大，如我上传一张120kb的图片，压缩后很有可能为140kb，base64会增加一部分。</li></ul></li></ul><p>简单示例：<br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> fullQuality = canvas.toDataURL(<span class="string">"image/jpeg"</span>, <span class="number">1.0</span>);</span><br><span class="line"><span class="comment">// data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...9oADAMBAAIRAxEAPwD/AD/6AP/Z"</span></span><br><span class="line"><span class="keyword">var</span> mediumQuality = canvas.toDataURL(<span class="string">"image/jpeg"</span>, <span class="number">0.5</span>);</span><br><span class="line"><span class="keyword">var</span> lowQuality = canvas.toDataURL(<span class="string">"image/jpeg"</span>, <span class="number">0.1</span>);</span><br></pre></td></tr></table></figure></p><p>完整代码:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;img src=&quot;&quot; alt=&quot;&quot; id=&quot;img&quot;  crossorigin=&quot;anonymous&quot;&gt;</span><br></pre></td></tr></table></figure></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><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">drawImg</span>(<span class="params">path, callback</span>) </span>&#123;</span><br><span class="line">                <span class="keyword">var</span> img = <span class="keyword">new</span> Image();</span><br><span class="line">                img.src = path;</span><br><span class="line">                img.onload = <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">                    <span class="comment">//默认按比例压缩    </span></span><br><span class="line">                    <span class="keyword">var</span> w = <span class="keyword">this</span>.width,</span><br><span class="line">                        h = <span class="keyword">this</span>.height;</span><br><span class="line">                    <span class="keyword">var</span> quality = <span class="number">0.75</span>; <span class="comment">// 默认图片质量为0.7    </span></span><br><span class="line"></span><br><span class="line">                    <span class="comment">//生成canvas    </span></span><br><span class="line">                    <span class="keyword">var</span> canvas = <span class="built_in">document</span>.createElement(<span class="string">'canvas'</span>);</span><br><span class="line">                    <span class="keyword">var</span> ctx = canvas.getContext(<span class="string">'2d'</span>);</span><br><span class="line"></span><br><span class="line">                    <span class="comment">// 创建属性节点    </span></span><br><span class="line">                    canvas.setAttribute(<span class="string">"width"</span>, w);</span><br><span class="line">                    canvas.setAttribute(<span class="string">"height"</span>, h);</span><br><span class="line"></span><br><span class="line">                    ctx.drawImage(<span class="keyword">this</span>, <span class="number">0</span>, <span class="number">0</span>, w, h);</span><br><span class="line">                    <span class="comment">// quality值越小，所绘制出的图像越模糊    </span></span><br><span class="line">                    <span class="keyword">var</span> base64 = canvas.toDataURL(<span class="string">'image/jpeg'</span>, quality);</span><br><span class="line">                    <span class="built_in">console</span>.log(<span class="string">"压缩后的质量："</span>+ base64.length / <span class="number">1024</span> * quality);</span><br><span class="line">                    <span class="comment">// 回调函数返回base64的值    </span></span><br><span class="line">                    callback(base64);</span><br><span class="line">                &#125;;</span><br><span class="line"></span><br><span class="line">            &#125;;</span><br><span class="line"></span><br><span class="line">            drawImg(<span class="string">"xinghaivps.png"</span>, <span class="function"><span class="keyword">function</span> (<span class="params">base</span>) </span>&#123;</span><br><span class="line">                <span class="comment">//直接将获取到的base64的字符串，放到一个image标签中就可看到测试后的压缩之后的样式图了  </span></span><br><span class="line">                <span class="built_in">document</span>.getElementById(<span class="string">"img"</span>).src = base;</span><br><span class="line">            &#125;)</span><br></pre></td></tr></table></figure><p>二、canvas.drewImage()</p><p>完整代码：<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;canvas id=&quot;myCanvas&quot;&gt;&lt;/canvas&gt;</span><br></pre></td></tr></table></figure></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><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">render</span>(<span class="params">src,size</span>) </span>&#123;</span><br><span class="line">               <span class="comment">// 创建一个 Image 对象  </span></span><br><span class="line">               <span class="keyword">var</span> image = <span class="keyword">new</span> Image();</span><br><span class="line">               <span class="comment">// 参数，最大高度  </span></span><br><span class="line">               <span class="comment">// 绑定 load 事件处理器，加载完成后执行  </span></span><br><span class="line">               image.onload = <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</span><br><span class="line">                   <span class="comment">// 获取 canvas DOM 对象  </span></span><br><span class="line">                   <span class="keyword">var</span> canvas = <span class="built_in">document</span>.getElementById(<span class="string">"myCanvas"</span>);</span><br><span class="line">                   <span class="comment">// 如果高度超标  </span></span><br><span class="line">                   <span class="keyword">if</span> (image.height &gt; size) &#123;</span><br><span class="line">                       <span class="comment">// 宽度等比例缩放 *=  </span></span><br><span class="line">                       image.width *= size / image.height;</span><br><span class="line">                       image.height = size;</span><br><span class="line">                   &#125;</span><br><span class="line">                   <span class="comment">// 获取 canvas的 2d 环境对象,  </span></span><br><span class="line">                   <span class="comment">// 可以理解Context是管理员，canvas是房子  </span></span><br><span class="line">                   <span class="keyword">var</span> ctx = canvas.getContext(<span class="string">"2d"</span>);</span><br><span class="line">                   <span class="comment">// canvas清屏  </span></span><br><span class="line">                   ctx.clearRect(<span class="number">0</span>, <span class="number">0</span>, canvas.width, canvas.height);</span><br><span class="line">                   <span class="comment">// 重置canvas宽高  </span></span><br><span class="line">                   canvas.width = image.width;</span><br><span class="line">                   canvas.height = image.height;</span><br><span class="line">                   <span class="comment">// 将图像绘制到canvas上  </span></span><br><span class="line">                   ctx.drawImage(image, <span class="number">0</span>, <span class="number">0</span>, image.width, image.height);</span><br><span class="line">                   <span class="comment">// !!! 注意，image 没有加入到 dom之中  </span></span><br><span class="line">               &#125;;</span><br><span class="line">               <span class="comment">// 设置src属性，浏览器会自动加载。  </span></span><br><span class="line">               <span class="comment">// 记住必须先绑定事件，才能设置src属性，否则会出同步问题。  </span></span><br><span class="line">               image.src = src;</span><br><span class="line">           &#125;;</span><br><span class="line"></span><br><span class="line">           render(<span class="string">'mei.jpg'</span>,<span class="number">1500</span>)</span><br></pre></td></tr></table></figure><p>参考：</p><ul><li><a href="https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/toDataURL" target="_blank" rel="noopener">MDN-HTMLCanvasElement-toDataURL</a></li><li><a href="https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/drawImage" target="_blank" rel="noopener">MDN-CanvasRenderingContext2D</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;最近遇到了图片压缩的问题，想在前端控制一下，所以有了一下代码。&lt;br&gt;
    
    </summary>
    
      <category term="Web开发" scheme="https://lijinglun.com/cates/Web%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="canvas" scheme="https://lijinglun.com/tags/canvas/"/>
    
      <category term="Web开发" scheme="https://lijinglun.com/tags/Web%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>chrome下调试小技巧（一）</title>
    <link href="https://lijinglun.com/2017/07/24/chrome_1/"/>
    <id>https://lijinglun.com/2017/07/24/chrome_1/</id>
    <published>2017-07-24T09:52:37.000Z</published>
    <updated>2026-07-24T05:13:05.443Z</updated>
    
    <content type="html"><![CDATA[<p>chrome下调试小技巧（一）</p><h2 id="1、快速格式化线上压缩的js和css"><a href="#1、快速格式化线上压缩的js和css" class="headerlink" title="1、快速格式化线上压缩的js和css"></a>1、快速格式化线上压缩的js和css</h2><p>我们通常看线上的js或者css都是这样的</p><p><img src="1.png" alt="css"><br><img src="3.png" alt="css"><br>通过在sources下的{}，点击即可格式化代码很方便<br><img src="5.png" alt="css"><br><img src="2.png" alt="css"><br><img src="4.png" alt="css"></p><h2 id="2、在浏览器中储存你的代码段"><a href="#2、在浏览器中储存你的代码段" class="headerlink" title="2、在浏览器中储存你的代码段"></a>2、在浏览器中储存你的代码段</h2><p>其实chrome中也是可以储存我们自己的代码的，如果不想每次都粘贴在控制台中或者临时想写些什么，那么sources中的Sinppets将是你的一个很好的选择，<br>Sinppets中你可以新建很多个不同的代码段，跟文本一样，可以写一些文字或者代码，可以command+s保存，如果你写的是js代码一类的，可以直接右键你的Sinppets<br>文件名称，点击Run，即可执行你的代码，也可以右键文件Save as保存文件到本地。<br><img src="6.png" alt="css"></p><h2 id="3、快速定位到指定的文件或者文件中的方法"><a href="#3、快速定位到指定的文件或者文件中的方法" class="headerlink" title="3、快速定位到指定的文件或者文件中的方法"></a>3、快速定位到指定的文件或者文件中的方法</h2><p>ctrl+p 项目中定位文件，以下查找VueJS库文件：<br><img src="1.gif" alt="css"><br>ctrl+shif+o 文件中定位成员函数，以下定位到VueJS的nextTick接口：<br><img src="2.gif" alt="css"></p><p>暂且写这么多，network及短点什么的，估计大家都会用了，就不介绍了。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;chrome下调试小技巧（一）&lt;/p&gt;
&lt;h2 id=&quot;1、快速格式化线上压缩的js和css&quot;&gt;&lt;a href=&quot;#1、快速格式化线上压缩的js和css&quot; class=&quot;headerlink&quot; title=&quot;1、快速格式化线上压缩的js和css&quot;&gt;&lt;/a&gt;1、快速格式化线上
      
    
    </summary>
    
      <category term="移动开发" scheme="https://lijinglun.com/cates/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Hexo" scheme="https://lijinglun.com/tags/Hexo/"/>
    
      <category term="移动开发" scheme="https://lijinglun.com/tags/%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://lijinglun.com/2015/10/08/hello-world/"/>
    <id>https://lijinglun.com/2015/10/08/hello-world/</id>
    <published>2015-10-08T02:24:35.000Z</published>
    <updated>2026-07-24T05:13:05.509Z</updated>
    
    <content type="html"><![CDATA[<h2 id="title-Hello-World"><a href="#title-Hello-World" class="headerlink" title="title: Hello World"></a>title: Hello World</h2><p>Welcome to <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="noopener">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="noopener">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="noopener">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="noopener">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="noopener">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="noopener">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Deployment</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h2 id=&quot;title-Hello-World&quot;&gt;&lt;a href=&quot;#title-Hello-World&quot; class=&quot;headerlink&quot; title=&quot;title: Hello World&quot;&gt;&lt;/a&gt;title: Hello World&lt;/h2&gt;&lt;p&gt;Welcome 
      
    
    </summary>
    
      <category term="Web开发" scheme="https://lijinglun.com/cates/Web%E5%BC%80%E5%8F%91/"/>
    
    
      <category term="Hexo" scheme="https://lijinglun.com/tags/Hexo/"/>
    
      <category term="Web开发" scheme="https://lijinglun.com/tags/Web%E5%BC%80%E5%8F%91/"/>
    
  </entry>
  
</feed>
