<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shmilyes</title>
    <description>The latest articles on DEV Community by Shmilyes (@shmilyes).</description>
    <link>https://dev.to/shmilyes</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F904737%2F5d5879d8-4410-49f3-af50-2b7272b84ca6.jpg</url>
      <title>DEV Community: Shmilyes</title>
      <link>https://dev.to/shmilyes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shmilyes"/>
    <language>en</language>
    <item>
      <title>Mini npm registry manager</title>
      <dc:creator>Shmilyes</dc:creator>
      <pubDate>Thu, 27 Oct 2022 13:27:16 +0000</pubDate>
      <link>https://dev.to/shmilyes/mini-npm-registry-manager-2748</link>
      <guid>https://dev.to/shmilyes/mini-npm-registry-manager-2748</guid>
      <description>&lt;h1&gt;
  
  
  mini-nrm
&lt;/h1&gt;

&lt;p&gt;Super lightweight npm registry manager&lt;/p&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/CreateWheel/mini-nrm"&gt;https://github.com/CreateWheel/mini-nrm&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No dependencies.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://packagephobia.com/result?p=mini-nrm"&gt;mini-nrm&lt;/a&gt; ~ &lt;strong&gt;20kB&lt;/strong&gt; | &lt;a href="https://packagephobia.com/result?p=nnrm"&gt;nnrm&lt;/a&gt; ~ &lt;strong&gt;7MB&lt;/strong&gt; | &lt;a href="https://packagephobia.com/result?p=nrm"&gt;nrm&lt;/a&gt; ~ &lt;strong&gt;15MB&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Customizing the registry image&lt;/li&gt;
&lt;li&gt;Test response speed details&lt;/li&gt;
&lt;li&gt;TypeScript type declarations included.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pjCbN6hk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dm0w30yln63l8ptk0qfs.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pjCbN6hk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dm0w30yln63l8ptk0qfs.gif" alt="mini-nrm" width="880" height="473"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; mini-nrm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because it is very slim, you can use &lt;code&gt;npx&lt;/code&gt; to manage the registry image directly without installing it&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx mini-nrm &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;mnrm --help&lt;/code&gt;: Show this help&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  Usage
    &lt;span class="nv"&gt;$ &lt;/span&gt;mnrm &lt;span class="o"&gt;[&lt;/span&gt;options]
  Options
    &lt;span class="nb"&gt;ls&lt;/span&gt;, list                            List all the registries
    use &amp;lt;name&amp;gt;                          Switching the registry
    add &amp;lt;name&amp;gt; &amp;lt;registry&amp;gt; &lt;span class="o"&gt;[&lt;/span&gt;home]        Add a custom registry
    &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-i&lt;/span&gt;, &lt;span class="nt"&gt;--info&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;                   Test the response &lt;span class="nb"&gt;time &lt;/span&gt;of all registries
    del, delete, &lt;span class="nb"&gt;rm&lt;/span&gt;, remove &amp;lt;name...&amp;gt;   Remove a custom registry
    h, &lt;span class="nt"&gt;-h&lt;/span&gt;, &lt;span class="nb"&gt;help&lt;/span&gt;, &lt;span class="nt"&gt;--help&lt;/span&gt;                 Show this &lt;span class="nb"&gt;help
  &lt;/span&gt;Examples

    &lt;span class="nv"&gt;$ &lt;/span&gt;mnrm add npm https://registry.npmjs.org/
    &lt;span class="c"&gt;# or&lt;/span&gt;
    &lt;span class="nv"&gt;$ &lt;/span&gt;mnrm add npm https://registry.npmjs.org/ https://www.npmjs.org

    &lt;span class="nv"&gt;$ &lt;/span&gt;mnrm use npm

    &lt;span class="nv"&gt;$ &lt;/span&gt;mnrm list

      &lt;span class="k"&gt;*&lt;/span&gt; npm &lt;span class="nt"&gt;---------&lt;/span&gt; https://registry.npmjs.org/
        yarn &lt;span class="nt"&gt;--------&lt;/span&gt; https://registry.yarnpkg.com/
        taobao &lt;span class="nt"&gt;------&lt;/span&gt; https://registry.npmmirror.com/
        tencent &lt;span class="nt"&gt;-----&lt;/span&gt; https://mirrors.cloud.tencent.com/npm/
        npmMirror &lt;span class="nt"&gt;---&lt;/span&gt; https://skimdb.npmjs.com/registry/
        github &lt;span class="nt"&gt;------&lt;/span&gt; https://npm.pkg.github.com/

    &lt;span class="nv"&gt;$ &lt;/span&gt;mnrm &lt;span class="nb"&gt;test&lt;/span&gt;

      &lt;span class="k"&gt;*&lt;/span&gt; npm &lt;span class="nt"&gt;---------&lt;/span&gt; 153 ms
        yarn &lt;span class="nt"&gt;--------&lt;/span&gt; 175 ms
        taobao &lt;span class="nt"&gt;------&lt;/span&gt; 519 ms
        tencent &lt;span class="nt"&gt;-----&lt;/span&gt; 121 ms
        npmMirror &lt;span class="nt"&gt;---&lt;/span&gt; 481 ms
        github &lt;span class="nt"&gt;------&lt;/span&gt; 169 ms

    &lt;span class="nv"&gt;$ &lt;/span&gt;mnrm &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt;

      ┌─────────┬─────────────┬───────┬───────────┬─────────┬─────────┬────────────────┬──────────┬──────────────────────────────────────────┐
      │ &lt;span class="o"&gt;(&lt;/span&gt;index&lt;span class="o"&gt;)&lt;/span&gt; │    name     │ code  │   total   │   DNS   │   TCP   │ start_transfer │ redirect │                effective                 │
      ├─────────┼─────────────┼───────┼───────────┼─────────┼─────────┼────────────────┼──────────┼──────────────────────────────────────────┤
      │    0    │    &lt;span class="s1"&gt;'npm'&lt;/span&gt;    │ &lt;span class="s1"&gt;'000'&lt;/span&gt; │ &lt;span class="s1"&gt;'Timeout'&lt;/span&gt; │ &lt;span class="s1"&gt;'27ms'&lt;/span&gt;  │  &lt;span class="s1"&gt;'0ms'&lt;/span&gt;  │     &lt;span class="s1"&gt;'0ms'&lt;/span&gt;      │  &lt;span class="s1"&gt;'0ms'&lt;/span&gt;   │      &lt;span class="s1"&gt;'https://registry.npmjs.org/'&lt;/span&gt;       │
      │    1    │   &lt;span class="s1"&gt;'yarn'&lt;/span&gt;    │ &lt;span class="s1"&gt;'000'&lt;/span&gt; │ &lt;span class="s1"&gt;'Timeout'&lt;/span&gt; │ &lt;span class="s1"&gt;'32ms'&lt;/span&gt;  │  &lt;span class="s1"&gt;'0ms'&lt;/span&gt;  │     &lt;span class="s1"&gt;'0ms'&lt;/span&gt;      │  &lt;span class="s1"&gt;'0ms'&lt;/span&gt;   │     &lt;span class="s1"&gt;'https://registry.yarnpkg.com/'&lt;/span&gt;      │
      │    2    │  &lt;span class="s1"&gt;'taobao'&lt;/span&gt;   │ &lt;span class="s1"&gt;'200'&lt;/span&gt; │  &lt;span class="s1"&gt;'654ms'&lt;/span&gt;  │ &lt;span class="s1"&gt;'41ms'&lt;/span&gt;  │ &lt;span class="s1"&gt;'214ms'&lt;/span&gt; │    &lt;span class="s1"&gt;'653ms'&lt;/span&gt;     │  &lt;span class="s1"&gt;'0ms'&lt;/span&gt;   │    &lt;span class="s1"&gt;'https://registry.npmmirror.com/'&lt;/span&gt;     │
      │    3    │  &lt;span class="s1"&gt;'tencent'&lt;/span&gt;  │ &lt;span class="s1"&gt;'200'&lt;/span&gt; │ &lt;span class="s1"&gt;'1159ms'&lt;/span&gt;  │ &lt;span class="s1"&gt;'251ms'&lt;/span&gt; │ &lt;span class="s1"&gt;'452ms'&lt;/span&gt; │    &lt;span class="s1"&gt;'1159ms'&lt;/span&gt;    │  &lt;span class="s1"&gt;'0ms'&lt;/span&gt;   │ &lt;span class="s1"&gt;'https://mirrors.cloud.tencent.com/npm/'&lt;/span&gt; │
      │    4    │ &lt;span class="s1"&gt;'npmMirror'&lt;/span&gt; │ &lt;span class="s1"&gt;'000'&lt;/span&gt; │ &lt;span class="s1"&gt;'Timeout'&lt;/span&gt; │ &lt;span class="s1"&gt;'22ms'&lt;/span&gt;  │  &lt;span class="s1"&gt;'0ms'&lt;/span&gt;  │     &lt;span class="s1"&gt;'0ms'&lt;/span&gt;      │  &lt;span class="s1"&gt;'0ms'&lt;/span&gt;   │   &lt;span class="s1"&gt;'https://skimdb.npmjs.com/registry/'&lt;/span&gt;   │
      │    5    │  &lt;span class="s1"&gt;'github'&lt;/span&gt;   │ &lt;span class="s1"&gt;'200'&lt;/span&gt; │ &lt;span class="s1"&gt;'2302ms'&lt;/span&gt;  │ &lt;span class="s1"&gt;'287ms'&lt;/span&gt; │ &lt;span class="s1"&gt;'775ms'&lt;/span&gt; │    &lt;span class="s1"&gt;'2301ms'&lt;/span&gt;    │ &lt;span class="s1"&gt;'1179ms'&lt;/span&gt; │  &lt;span class="s1"&gt;'https://github.com/features/packages'&lt;/span&gt;  │
      └─────────┴─────────────┴───────┴───────────┴─────────┴─────────┴────────────────┴──────────┴──────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  JavaScript API
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mnrm&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mini-nrm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mnrm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;// output&lt;/span&gt;
&lt;span class="c1"&gt;// * npm --------- https://registry.npmjs.org/&lt;/span&gt;
&lt;span class="c1"&gt;//   yarn -------- https://registry.yarnpkg.com/&lt;/span&gt;
&lt;span class="c1"&gt;//   taobao ------ https://registry.npmmirror.com/&lt;/span&gt;
&lt;span class="c1"&gt;//   tencent ----- https://mirrors.cloud.tencent.com/npm/&lt;/span&gt;
&lt;span class="c1"&gt;//   npmMirror --- https://skimdb.npmjs.com/registry/&lt;/span&gt;
&lt;span class="c1"&gt;//   github ------ https://npm.pkg.github.com/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>javasceipt</category>
      <category>web</category>
      <category>npm</category>
    </item>
    <item>
      <title>How to keep the HTTP cache fresh</title>
      <dc:creator>Shmilyes</dc:creator>
      <pubDate>Sun, 07 Aug 2022 10:59:22 +0000</pubDate>
      <link>https://dev.to/shmilyes/how-to-keep-the-http-cache-fresh-22i9</link>
      <guid>https://dev.to/shmilyes/how-to-keep-the-http-cache-fresh-22i9</guid>
      <description>&lt;p&gt;HTTP caching is divided into two types, but for static resources, I think most people open the mandatory cache, right?&lt;/p&gt;

&lt;p&gt;But there is a disadvantage of forced caching that there is no way to guarantee the &lt;strong&gt;freshness (latest)&lt;/strong&gt; of the resources, you can only wait for the cache time to expire to get the latest resource content&lt;/p&gt;

&lt;p&gt;So I wrote a library &lt;a href="https://github.com/Lete114/cache-hash"&gt;Cache-Hash&lt;/a&gt; that specifically deals with HTTP cache busting&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I've used it on my blog: &lt;a href="https://blog.imlete.cn"&gt;https://blog.imlete.cn&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Principle
&lt;/h2&gt;

&lt;p&gt;By adding a hash version number to the resources introduced to the website, once the content changes, the hash will change, so that the cache can be broken by changing the url address, which ensures that the resources referenced by the website are up to date.&lt;/p&gt;

&lt;p&gt;For example, the following form&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://demo.com/js/main.js?v=5e74b42bf5"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;You can use &lt;strong&gt;CLI (command line tool)&lt;/strong&gt; or &lt;strong&gt;JavaScript API&lt;/strong&gt; to generate hash for references to static resources&lt;/p&gt;

&lt;p&gt;can be installed globally using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;cache-hash &lt;span class="nt"&gt;-g&lt;/span&gt;

cache-hash &lt;span class="nt"&gt;--target&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; public

&lt;span class="c"&gt;# abbreviated&lt;/span&gt;

cache-hash &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you don't want to install it globally, you can use npx&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cache-hash &lt;span class="nt"&gt;--target&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="nt"&gt;--output&lt;/span&gt; public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;p&gt;It reads your given &lt;strong&gt;target&lt;/strong&gt; directory, detects all html, css, js in the directory, and generates an &lt;strong&gt;AST (Abstract Syntax Tree) for these files&lt;/strong&gt;, and then compiles the source code back through the ast syntax tree after modifying the contents of the ast syntax tree.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>http</category>
      <category>cache</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
