<?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: pnpm</title>
    <description>The latest articles on DEV Community by pnpm (@pnpm).</description>
    <link>https://dev.to/pnpm</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%2Forganization%2Fprofile_image%2F1797%2Fae6be511-5635-4ab3-8ac1-762ccf317ac8.png</url>
      <title>DEV Community: pnpm</title>
      <link>https://dev.to/pnpm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pnpm"/>
    <language>en</language>
    <item>
      <title>2021 pnpm recap</title>
      <dc:creator>Zoltan Kochan</dc:creator>
      <pubDate>Sat, 01 Jan 2022 21:18:19 +0000</pubDate>
      <link>https://dev.to/pnpm/2021-pnpm-recap-43a3</link>
      <guid>https://dev.to/pnpm/2021-pnpm-recap-43a3</guid>
      <description>&lt;p&gt;It is the end of the year and it was a good year for pnpm, so let's see how it went.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Download stats
&lt;/h3&gt;

&lt;p&gt;My goal this year was to beat Bower by the number of downloads. We were able to achieve this goal &lt;a href="https://npm-stat.com/charts.html?package=pnpm&amp;amp;package=bower&amp;amp;from=2021-01-01&amp;amp;to=2021-12-29" rel="noopener noreferrer"&gt;in November&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpnpm.io%2Fimg%2Fblog%2Fpnpm-vs-bower-stats.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpnpm.io%2Fimg%2Fblog%2Fpnpm-vs-bower-stats.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;pnpm was downloaded about &lt;a href="https://npm-stat.com/charts.html?package=pnpm&amp;amp;from=2016-12-01&amp;amp;to=2021-12-29" rel="noopener noreferrer"&gt;3 times more&lt;/a&gt; in 2021 than in 2020:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpnpm.io%2Fimg%2Fblog%2Fdownload-stats-2021.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpnpm.io%2Fimg%2Fblog%2Fdownload-stats-2021.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;These stats don't even measure all the different ways that pnpm may be installed!&lt;br&gt;
They only measure the downloads of the &lt;a href="https://www.npmjs.com/package/pnpm" rel="noopener noreferrer"&gt;pnpm npm package&lt;/a&gt;. This year we also added compiled binary versions of pnpm, which are shipped differently.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Docs visits
&lt;/h3&gt;

&lt;p&gt;We collect some unpersonalized stats from our docs using Google Analytics.&lt;br&gt;
In 2021, sometimes we had more than 2,000 unique visitors a week.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpnpm.io%2Fimg%2Fblog%2Fga-unique-visits-2021.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpnpm.io%2Fimg%2Fblog%2Fga-unique-visits-2021.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most of our users are from the United States and China.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpnpm.io%2Fimg%2Fblog%2Fcountries-2021.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpnpm.io%2Fimg%2Fblog%2Fcountries-2021.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub stars
&lt;/h3&gt;

&lt;p&gt;Our &lt;a href="https://github.com/pnpm/pnpm" rel="noopener noreferrer"&gt;main GitHub repository&lt;/a&gt; received +5,000 stars this year.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpnpm.io%2Fimg%2Fblog%2Fstars-2021.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpnpm.io%2Fimg%2Fblog%2Fstars-2021.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  New users
&lt;/h3&gt;

&lt;p&gt;Our biggest new user this year is &lt;a href="https://github.com/pnpm/pnpm.github.io/pull/89" rel="noopener noreferrer"&gt;Bytedance&lt;/a&gt; (the company behind TikTok).&lt;/p&gt;

&lt;p&gt;Also, many great open-source projects started to use pnpm. Some switched to pnpm because of its great support of monorepos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/vuejs/vue-next" rel="noopener noreferrer"&gt;Vue&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vitejs/vite" rel="noopener noreferrer"&gt;Vite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;and &lt;a href="https://pnpm.io/workspaces#usage-examples" rel="noopener noreferrer"&gt;others&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some switched because they like how efficient, fast, and beautiful pnpm is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Autoprefixer/status/1476226146488692736" rel="noopener noreferrer"&gt;Autoprefixer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/PostCSS/status/1470438664006258701" rel="noopener noreferrer"&gt;PostCSS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://twitter.com/Browserslist/status/1468264308308156419" rel="noopener noreferrer"&gt;Browserslist&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Feature highlights
&lt;/h2&gt;

&lt;h3&gt;
  
  
  New lockfile format (since &lt;a href="https://github.com/pnpm/pnpm/releases/tag/v6.0.0" rel="noopener noreferrer"&gt;v6.0.0&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;One of the first and most important changes this year was the new &lt;code&gt;pnpm-lock.yaml&lt;/code&gt; format. This was a breaking change, so we had to release v6. But it was a success. The old lockfile was causing Git conflicts frequently. Since the new format was introduced, we did not receive any complaints about Git conflicts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Managing Node.js versions (since &lt;a href="https://github.com/pnpm/pnpm/releases/tag/v6.12.0" rel="noopener noreferrer"&gt;v6.12.0&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;We shipped a new command (&lt;code&gt;pnpm env&lt;/code&gt;) that allows to manage Node.js versions. So you may use pnpm instead of Node.js version managers like nvm or Volta.&lt;/p&gt;

&lt;p&gt;Also, pnpm is shipped as a standalone executable, so you can run it even with no Node.js preinstalled on the system.&lt;/p&gt;

&lt;h3&gt;
  
  
  Injecting local dependencies (since &lt;a href="https://github.com/pnpm/pnpm/releases/tag/v6.20.0" rel="noopener noreferrer"&gt;v6.20.0&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;You may "inject" a local dependency. By default, local dependencies are symlinked to &lt;code&gt;node_modules&lt;/code&gt; but with this new feature you may instruct pnpm to hard link the files of the package instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Improved reporting of peer dependency issues (since &lt;a href="https://github.com/pnpm/pnpm/releases/tag/v6.24.0" rel="noopener noreferrer"&gt;v6.24.0&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;Peer dependency issues used to be printed as plain text and it was hard to understand them. They are now all grouped and printed in a nice hierarchy structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The competition
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Yarn
&lt;/h3&gt;

&lt;p&gt;Yarn added a pnpm linker in &lt;a href="https://dev.to/arcanis/yarn-31-corepack-esm-pnpm-optional-packages--3hak#new-install-mode-raw-pnpm-endraw-"&gt;v3.1&lt;/a&gt;. So Yarn can create a similar node-modules directory structure to the one that pnpm creates.&lt;/p&gt;

&lt;p&gt;Also, the Yarn team plans to implement a content-addressable storage to be more disk space efficient.&lt;/p&gt;

&lt;h3&gt;
  
  
  npm
&lt;/h3&gt;

&lt;p&gt;The npm team decided to also adopt the symlinked node-modules directory structure that pnpm uses (related &lt;a href="https://github.com/npm/rfcs/blob/main/accepted/0042-isolated-mode.md" rel="noopener noreferrer"&gt;RFC&lt;/a&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Others
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://twitter.com/jarredsumner/status/1473416431291174912/photo/1" rel="noopener noreferrer"&gt;Bun&lt;/a&gt; written in Zig and &lt;a href="https://github.com/voltpkg/volt" rel="noopener noreferrer"&gt;Volt&lt;/a&gt; written in Rust both claim to be faster than npm/Yarn/pnpm. I did not benchmark these new package managers yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Plans
&lt;/h2&gt;

&lt;p&gt;Faster, better, best.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>pnpm v4.9 comes with command completion!</title>
      <dc:creator>Zoltan Kochan</dc:creator>
      <pubDate>Fri, 31 Jan 2020 20:56:55 +0000</pubDate>
      <link>https://dev.to/pnpm/pnpm-v4-9-comes-with-command-completion-4713</link>
      <guid>https://dev.to/pnpm/pnpm-v4-9-comes-with-command-completion-4713</guid>
      <description>&lt;p&gt;Command completion in bash, zsh, fish is awesome! Unfortunately, even though there are thousands of great command-line tools in the npm registry, I cannot recall any (except the npm CLI) that comes with command completion.&lt;/p&gt;

&lt;p&gt;A few weeks ago &lt;a href="https://github.com/nikoladev"&gt;nikoladev&lt;/a&gt; suggested to &lt;a href="https://github.com/pnpm/pnpm/issues/2229"&gt;implement autompletion in pnpm&lt;/a&gt;. After a brief investigation, I have found a brilliant tool that helps with autocompletion of CLI apps written in Node.js. This tool is called &lt;a href="https://github.com/mklabs/tabtab"&gt;tabtab&lt;/a&gt; and is currently not maintained, so I &lt;a href="https://github.com/pnpm/tabtab"&gt;forked it&lt;/a&gt; and added autocompletions to pnpm👌.&lt;/p&gt;

&lt;p&gt;To set up autocompletion, just update &lt;a href="https://github.com/pnpm/pnpm"&gt;pnpm&lt;/a&gt; to v4.9 and run &lt;code&gt;pnpm install-completion&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Let's see what you can do with it.&lt;/p&gt;

&lt;p&gt;Type &lt;code&gt;pnpm &amp;lt;tab-tab&amp;gt;&lt;/code&gt; and see all the available commands:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fycr3o0khsnx62dxv5b87.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fycr3o0khsnx62dxv5b87.png" alt="Alt Text" width="516" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Type &lt;code&gt;pnpm remove &amp;lt;tab-tab&amp;gt;&lt;/code&gt; and see the list of dependencies currently installed. This also works with &lt;code&gt;pnpm update&lt;/code&gt; and &lt;code&gt;pnpm outdated&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn5zj6lk6nnniabxcle1l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn5zj6lk6nnniabxcle1l.png" alt="Alt Text" width="516" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Type &lt;code&gt;pnpm --filter &amp;lt;tab-tab&amp;gt;&lt;/code&gt; and see the list of projects in the workspace:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6uuymuc9conrz0umb1zr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6uuymuc9conrz0umb1zr.png" alt="Alt Text" width="516" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Type &lt;code&gt;pnpm run &amp;lt;tab-tab&amp;gt;&lt;/code&gt; and see the list of available scripts:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frsu3kfm6lo5n0qjnktgv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Frsu3kfm6lo5n0qjnktgv.png" alt="Alt Text" width="516" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Type any command, type tab-tab and see the list of supported options:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flhosl3mqp71po68jd6re.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Flhosl3mqp71po68jd6re.png" alt="Alt Text" width="516" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Type an option and see the possible values:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmw41erm8g48aas5vesqw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmw41erm8g48aas5vesqw.png" alt="Alt Text" width="516" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And these are just a few examples! Happy tabbing😃&lt;/p&gt;

&lt;p&gt;In a future version of pnpm we will also add descriptions to completions😍&lt;/p&gt;

</description>
      <category>pnpm</category>
      <category>node</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
