{"id":410319,"date":"2024-06-29T21:18:56","date_gmt":"2024-06-29T21:18:56","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=410319"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=410319","title":{"rendered":"<span>Only 39% of the functions in node_modules are unique in the default Angular project<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Only <strong>39%<\/strong> of the functions in <code>node_modules<\/code> are unique in the default Angular project created by <code>ng new my-app<\/code>.<\/p>\n<p>  <\/p>\n<p>I think the developers of open source solve problems in the same ways, because they study the same algorithms. Well, why be honest, they copy the popular solutions from StackOverflow also.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/yc\/dp\/cj\/ycdpcjo5oq8py5hwvekc4spkggs.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/yc\/dp\/cj\/ycdpcjo5oq8py5hwvekc4spkggs.jpeg\" data-blurred=\"true\"\/><\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h2 id=\"how-to-compare-functions-in-javascript\">How to compare functions in Javascript?<\/h2>\n<p>  <\/p>\n<p>If you want to compare functions in Javascript, then just convert them to string form:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const a = () => 'hi'; a.toString(); \/\/ \"() => 'hi'\"<\/code><\/pre>\n<p>  <\/p>\n<h3 id=\"if-variable-names-are-different\">If variable names are different<\/h3>\n<p>  <\/p>\n<p>It is necessary to bring them to the same form using the <a href=\"https:\/\/github.com\/mishoo\/UglifyJS\" rel=\"nofollow noopener noreferrer\">UglifyJs<\/a> library. <strong>UglifyJs<\/strong> will minimizes functions, remove unnecessary strings, and make simple calculations.<\/p>\n<p>  <\/p>\n<h2 id=\"how-do-you-extract-functions-from-a-javascript-file\">How do you extract functions from a Javascript file?<\/h2>\n<p>  <\/p>\n<p>For this I used the <a href=\"https:\/\/esprima.org\/\" rel=\"nofollow noopener noreferrer\">Esprima<\/a> library. We parse the file and walk an AST tree. I think that it would be possible only with <strong>Uglifyjs<\/strong>, but something was wrong and I was too lazy to figure it out.<\/p>\n<p>  <\/p>\n<h2 id=\"action-plan\">Action plan<\/h2>\n<p>  <\/p>\n<ol>\n<li>Iterate through all the <code>* .js<\/code> files in the directory<\/li>\n<li>Parse each file and extract functions of types <code>ArrowFunctionExpression<\/code>,<code>FunctionExpression<\/code> and <code>FunctionDeclaration<\/code><\/li>\n<li>Compress each of the functions using <code>UglifyJs<\/code> and write it to a file whose name is the hash of the function<\/li>\n<li>Put the id, path and hash to the separate file <code>info.csv<\/code><\/li>\n<li>Load the file <code>info.csv<\/code> into<code>SQLite<\/code> and make all kinds of queries, because this database is <a href=\"https:\/\/antonz.org\/sqlite-is-not-a-toy-database\/\" rel=\"nofollow noopener noreferrer\">not a toy<\/a>!<\/li>\n<\/ol>\n<p>  <\/p>\n<h3 id=\"implementation-details\">Implementation details<\/h3>\n<p>  <\/p>\n<ul>\n<li>I named all arrow functions and functional expressions <code>z<\/code>;<\/li>\n<li>I renamed the usual functions to <code>MORK<\/code>, but kept the original names separately, because the function may be the same, but have a different name;<\/li>\n<li>Perhaps with these renames I lost some of the statistics related to recursive functions, well, okay!<\/li>\n<\/ul>\n<p>  <\/p>\n<h3 id=\"extracting-functions-from-a-file\">Extracting functions from a file<\/h3>\n<p>  <\/p>\n<p>Listing of the file from which we will extract functions:<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">(function () {     const arbuz = (test) => {         function apple(t) {             function test () {                 return 'ttt';             }             return t + 3;         }         const aa = 1;         const b1 = () => 2;         \/\/ comment         return aa + b1() + apple(test);     }     return arbuz;  })();<\/code><\/pre>\n<p>  <\/p>\n<p>Note that some of the expressions are calculated, that&#8217;s comfortable for function comparing. The list of the extracted functions:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\"const z=function(){return n=>{return 3+(n+3)}};\"; \"const z=n=>{return 3+(n+3)};\"; \"function MORK(n){return n+3}\"; \"function MORK(){return\"ttt\"}\"; \"const z=()=>2;\";<\/code><\/pre>\n<p>  <\/p>\n<p>Full script can be found <a href=\"https:\/\/github.com\/gurov\/identical-functions\/blob\/master\/index.js\" rel=\"nofollow noopener noreferrer\">here<\/a><\/p>\n<p>  <\/p>\n<h2 id=\"first-research-object-node_modules-of-the-default-angular-11-project\">First research object: <code>node_modules<\/code> of the default Angular 11 project<\/h2>\n<p>  <\/p>\n<p>So, we have to create a project using <code>@angular\/cli<\/code>: <code>ng new my-app<\/code> and run our script to parse <code>node_modules<\/code>. It can take a lot of time.<\/p>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">View package.json<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"json\">{   \"name\": \"my-app\",   \"version\": \"0.0.0\",   \"scripts\": {     \"ng\": \"ng\",     \"start\": \"ng serve\",     \"build\": \"ng build --prod\",     \"test\": \"ng test\",     \"lint\": \"ng lint\",     \"e2e\": \"ng e2e\"   },   \"private\": true,   \"dependencies\": {     \"@angular\/animations\": \"~11.2.10\",     \"@angular\/common\": \"~11.2.10\",     \"@angular\/compiler\": \"~11.2.10\",     \"@angular\/core\": \"~11.2.10\",     \"@angular\/forms\": \"~11.2.10\",     \"@angular\/platform-browser\": \"~11.2.10\",     \"@angular\/platform-browser-dynamic\": \"~11.2.10\",     \"@angular\/router\": \"~11.2.10\",     \"rxjs\": \"~6.6.0\",     \"tslib\": \"^2.0.0\",     \"zone.js\": \"~0.11.3\"   },   \"devDependencies\": {     \"@angular-devkit\/build-angular\": \"~0.1102.9\",     \"@angular\/cli\": \"~11.2.9\",     \"@angular\/compiler-cli\": \"~11.2.10\",     \"@types\/jasmine\": \"~3.6.0\",     \"@types\/node\": \"^12.11.1\",     \"codelyzer\": \"^6.0.0\",     \"jasmine-core\": \"~3.6.0\",     \"jasmine-spec-reporter\": \"~5.0.0\",     \"karma\": \"~6.1.0\",     \"karma-chrome-launcher\": \"~3.1.0\",     \"karma-coverage\": \"~2.0.3\",     \"karma-jasmine\": \"~4.0.0\",     \"karma-jasmine-html-reporter\": \"^1.5.0\",     \"protractor\": \"~7.0.0\",     \"ts-node\": \"~8.3.0\",     \"tslint\": \"~6.1.0\",     \"typescript\": \"~4.1.5\"   } }<\/code><\/pre>\n<p>  <\/p>\n<p>The package-lock.json <a href=\"https:\/\/github.com\/gurov\/identical-functions\/blob\/master\/my-app-angular\/package-lock.json\" rel=\"nofollow noopener noreferrer\">here<\/a><\/p>\n<\/div><\/div>\n<p>  <\/p>\n<h3 id=\"results\">Results<\/h3>\n<p>  <\/p>\n<p>The node_modules folder contains <strong>26982<\/strong> * .js files:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">$ find . -name '*.js' | wc -l 26982<\/code><\/pre>\n<p>  <\/p>\n<p>Number of functions found: <strong>338230<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">sqlite> select count(*) from info; 338230<\/code><\/pre>\n<p>  <\/p>\n<p>Including unique: <strong>130886<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">sqlite> Select count(*) from (SELECT hash, count(id) as c FROM info group By hash); 130886<\/code><\/pre>\n<p>  <\/p>\n<p>Whence it follows that <code>130886\/338230 * 100% = 39%<\/code> of the functions are really unique, and the rest are duplicates of existing ones.<\/p>\n<p>  <\/p>\n<p>You can download the <em>csv<\/em> file for self-checking <a href=\"https:\/\/github.com\/gurov\/identical-functions\/blob\/master\/info-angular.csv\" rel=\"nofollow noopener noreferrer\">here<\/a>.<\/p>\n<p>  <\/p>\n<h3 id=\"top-20-most-popular-functions-in-node_modules-for-an-angular-project\">Top 20 most popular functions in <code>node_modules<\/code> for an Angular project<\/h3>\n<p>  <\/p>\n<p>Function with the largest number of duplicates.<\/p>\n<p>  <\/p>\n<pre><code class=\"sql\">SELECT hash, count(id) as c FROM info group By hash order by c desc LIMIT 20;<\/code><\/pre>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>#<\/th>\n<th>id<\/th>\n<th>number of duplicates<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>285d00ca29fcc46aa113c7aefc63827d<\/td>\n<td>2730<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>cf6a0564f1128496d1e4706f302787d6<\/td>\n<td>1871<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>12f746f2689073d5c949998e0216f68a<\/td>\n<td>1174<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>7d1e7aad635be0f7382696c4f846beae<\/td>\n<td>772<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>c2da306af9b041ba213e3b189699d45c<\/td>\n<td>699<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>c41eb44114860f3aa1e9fa79c779e02f<\/td>\n<td>697<\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>5911b29c89fa44f28ce030aa5e433327<\/td>\n<td>691<\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td>05c2b9b254be7e4b8460274c1353b5ad<\/td>\n<td>653<\/td>\n<\/tr>\n<tr>\n<td>9<\/td>\n<td>fcaede1b9e574664c893e75ee7dc1d8b<\/td>\n<td>652<\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td>e743dd760a03449be792c00e65154a48<\/td>\n<td>635<\/td>\n<\/tr>\n<tr>\n<td>11<\/td>\n<td>777c390d3cc4663f8ebe4933e5c33e9d<\/td>\n<td>441<\/td>\n<\/tr>\n<tr>\n<td>12<\/td>\n<td>27628ad740cff22386b0ff029e844e85<\/td>\n<td>385<\/td>\n<\/tr>\n<tr>\n<td>13<\/td>\n<td>f6822db5c8812f4b09ab142afe908cda<\/td>\n<td>375<\/td>\n<\/tr>\n<tr>\n<td>14<\/td>\n<td>d98a03a472615305b012eceb3e9947d5<\/td>\n<td>330<\/td>\n<\/tr>\n<tr>\n<td>15<\/td>\n<td>4728096fca2b3575800dafbdebf4276a<\/td>\n<td>324<\/td>\n<\/tr>\n<tr>\n<td>16<\/td>\n<td>7b769d3e4ba438fc53b42ad8bece86ba<\/td>\n<td>289<\/td>\n<\/tr>\n<tr>\n<td>17<\/td>\n<td>7d6f69751712ef9fa94238b38120adc6<\/td>\n<td>282<\/td>\n<\/tr>\n<tr>\n<td>18<\/td>\n<td>b7081aad7510b0993fcb57bfb95c5c2c<\/td>\n<td>255<\/td>\n<\/tr>\n<tr>\n<td>19<\/td>\n<td>d665499155e104f749bf3a67caed576a<\/td>\n<td>250<\/td>\n<\/tr>\n<tr>\n<td>20<\/td>\n<td>99fa7dfce87269a564fc848a7f7515b9<\/td>\n<td>250<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<ol>\n<li>\n<p>285d00ca29fcc46aa113c7aefc63827d, 2730 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(){};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>cf6a0564f1128496d1e4706f302787d6, 1871 identical, function names usually: <code>__export<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function MORK(r){for(var o in r)exports.hasOwnProperty(o)||(exports[o]=r[o])}<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>12f746f2689073d5c949998e0216f68a, 1174 identical, function names<code>_interopRequireDefault<\/code> \u0438 <code>__importDefault<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function MORK(e){return e&amp;&amp;e.__esModule?e:{default:e}}<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>7d1e7aad635be0f7382696c4f846beae, 772 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function MORK(){}<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>c2da306af9b041ba213e3b189699d45c, 699 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(o,_){o.__proto__=_};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>c41eb44114860f3aa1e9fa79c779e02f, 697 identical, functions name: <code>__<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function MORK(){this.constructor=d}<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>5911b29c89fa44f28ce030aa5e433327, 691 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(n,o){for(var r in o)o.hasOwnProperty(r)&amp;&amp;(n[r]=o[r])};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>05c2b9b254be7e4b8460274c1353b5ad, 653 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(t,n){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&amp;&amp;function(t,n){t.__proto__=n}||function(t,n){for(var o in n)n.hasOwnProperty(o)&amp;&amp;(t[o]=n[o])},extendStatics(t,n)};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>fcaede1b9e574664c893e75ee7dc1d8b, 652 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(t,o){function e(){this.constructor=t}extendStatics(t,o),t.prototype=null===o?Object.create(o):(e.prototype=o.prototype,new e)};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>e743dd760a03449be792c00e65154a48, 635 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function(){var r=function(t,o){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&amp;&amp;function(t,o){t.__proto__=o}||function(t,o){for(var n in o)o.hasOwnProperty(n)&amp;&amp;(t[n]=o[n])})(t,o)};return function(t,o){function n(){this.constructor=t}r(t,o),t.prototype=null===o?Object.create(o):(n.prototype=o.prototype,new n)}};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>777c390d3cc4663f8ebe4933e5c33e9d, 441 identical, function names usually: <code>Rule<\/code>, <code>AsapScheduler<\/code>, <code>ComplexOuterSubscriber<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function MORK(){return null!==_super&amp;&amp;_super.apply(this,arguments)||this}<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>27628ad740cff22386b0ff029e844e85, 385 identical, function names usually: <code>identity<\/code>, <code>forwardResolution<\/code> \u0438 \u0442\u0434<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function MORK(n){return n}<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>f6822db5c8812f4b09ab142afe908cda, 375 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(n){};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>d98a03a472615305b012eceb3e9947d5, 330 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(n,c){};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>4728096fca2b3575800dafbdebf4276a, 324 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(n){return n};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>7b769d3e4ba438fc53b42ad8bece86ba, 289 identical, function names:<code>plural<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function MORK(t){var r=Math.floor(Math.abs(t)),t=t.toString().replace(\/^[^.]*\\.?\/,\"\").length;return 1===r&amp;&amp;0===t?1:5}<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>7d6f69751712ef9fa94238b38120adc6, 255 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(){return this};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>b7081aad7510b0993fcb57bfb95c5c2c, 250 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(){return!1};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>d665499155e104f749bf3a67caed576a, 250 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(n){return null==n};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>99fa7dfce87269a564fc848a7f7515b9, 255 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(a,c){this._array.forEach(a,c)};<\/code><\/pre>\n<p>  <\/li>\n<\/ol>\n<p>  <\/p>\n<h2 id=\"files-with-the-largest-number-of-functions\">Files with the largest number of functions<\/h2>\n<p>  <\/p>\n<pre><code class=\"sql\">SELECT count(id) as c, path FROM info group By path order by c desc LIMIT 20;<\/code><\/pre>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>quantity<\/th>\n<th>file<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>13638<\/td>\n<td><code>typescript\/lib\/tsserver.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>13617<\/td>\n<td><code>typescript\/lib\/tsserverlibrary.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>12411<\/td>\n<td><code>typescript\/lib\/typescriptServices.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>12411<\/td>\n<td><code>typescript\/lib\/typescript.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>12411<\/td>\n<td><code>@schematics\/angular\/third_party\/github.com\/Microsoft\/TypeScript\/lib\/typescript.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>10346<\/td>\n<td><code>sass\/sass.dart.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>8703<\/td>\n<td><code>typescript\/lib\/typingsInstaller.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>8528<\/td>\n<td><code>typescript\/lib\/tsc.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>3933<\/td>\n<td><code>@angular\/compiler\/bundles\/compiler.umd.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>3803<\/td>\n<td><code>@angular\/compiler\/bundles\/compiler.umd.min.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>2602<\/td>\n<td><code>selenium-webdriver\/lib\/test\/data\/js\/tinymce.min.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>2264<\/td>\n<td><code>@angular\/core\/bundles\/core.umd.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>2028<\/td>\n<td><code>@angular\/core\/bundles\/core.umd.min.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>1457<\/td>\n<td><code>terser\/dist\/bundle.min.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>1416<\/td>\n<td><code>rxjs\/bundles\/rxjs.umd.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>1416<\/td>\n<td><code>@angular-devkit\/schematics\/node_modules\/rxjs\/bundles\/rxjs.umd.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>1416<\/td>\n<td><code>@angular-devkit\/core\/node_modules\/rxjs\/bundles\/rxjs.umd.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>1416<\/td>\n<td><code>@angular-devkit\/build-webpack\/node_modules\/rxjs\/bundles\/rxjs.umd.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>1416<\/td>\n<td><code>@angular-devkit\/build-angular\/node_modules\/rxjs\/bundles\/rxjs.umd.js<\/code><\/td>\n<\/tr>\n<tr>\n<td>1416<\/td>\n<td><code>@angular-devkit\/architect\/node_modules\/rxjs\/bundles\/rxjs.umd.js<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<h2 id=\"what-about-the-production-js-bundle\">What about the production js bundle?<\/h2>\n<p>  <\/p>\n<p>Nothing really interesting. The Webpack works efficiently. 95% functions are unique of the 1282 used. Here are top five functions that have duplicates:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>quantity<\/th>\n<th>function<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>11<\/td>\n<td><code>const z=function(){};<\/code><\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td><code>const z=()=>R;<\/code><\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td><code>const z=function(n){return new(n||t)};<\/code><\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td><code>const z=function(n){};<\/code><\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td><code>const z=()=>{};<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<h2 id=\"what-about-react\">What about React?<\/h2>\n<p>  <\/p>\n<p>I also checked React. I put the comparison in the table below:<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>In the <code>node_modules<\/code><\/th>\n<th>Angular<\/th>\n<th>React<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>total * .js files<\/td>\n<td>26982<\/td>\n<td>23942<\/td>\n<\/tr>\n<tr>\n<td>total functions<\/td>\n<td>338230<\/td>\n<td>163385<\/td>\n<\/tr>\n<tr>\n<td>unique functions<\/td>\n<td>130886<\/td>\n<td>92766<\/td>\n<\/tr>\n<tr>\n<td>% of unique functions<\/td>\n<td>39%<\/td>\n<td>57%<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<p>You can download the <em>csv<\/em> file for self-checking <a href=\"https:\/\/github.com\/gurov\/identical-functions\/blob\/master\/info-react.csv\" rel=\"nofollow noopener noreferrer\">here<\/a>.<\/p>\n<p>  <\/p>\n<h3 id=\"top-20-most-popular-functions-in-node_modules-for-the-react-project\">Top 20 most popular functions in <code>node_modules<\/code> for the React project<\/h3>\n<p>  <\/p>\n<p>The react project was generated by <code>create-react-app my-app<\/code>. The files <code>package.json<\/code> and <code>yarn.lock<\/code> are <a href=\"https:\/\/github.com\/gurov\/identical-functions\/tree\/master\/my-app-react\" rel=\"nofollow noopener noreferrer\">here<\/a>.<\/p>\n<p>  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>#<\/th>\n<th>id<\/th>\n<th>number of duplicates<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>1<\/td>\n<td>12f746f2689073d5c949998e0216f68a<\/td>\n<td>1377<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>285d00ca29fcc46aa113c7aefc63827d<\/td>\n<td>1243<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>3f993321f73e83f277c20c178e5587b9<\/td>\n<td>989<\/td>\n<\/tr>\n<tr>\n<td>4<\/td>\n<td>54782ec6cef850906484808b86946b33<\/td>\n<td>299<\/td>\n<\/tr>\n<tr>\n<td>5<\/td>\n<td>7d1e7aad635be0f7382696c4f846beae<\/td>\n<td>278<\/td>\n<\/tr>\n<tr>\n<td>6<\/td>\n<td>d11004e998280b565ad084b0ad5ca214<\/td>\n<td>239<\/td>\n<\/tr>\n<tr>\n<td>7<\/td>\n<td>a02c66d8928b3353552e4804c6714326<\/td>\n<td>237<\/td>\n<\/tr>\n<tr>\n<td>8<\/td>\n<td>79e9bd3cdf15cf0af97f73ccaed50fa0<\/td>\n<td>231<\/td>\n<\/tr>\n<tr>\n<td>9<\/td>\n<td>7d6f69751712ef9fa94238b38120adc6<\/td>\n<td>189<\/td>\n<\/tr>\n<tr>\n<td>10<\/td>\n<td>b8dd34af96b042c23a4be7f82c881fe4<\/td>\n<td>176<\/td>\n<\/tr>\n<tr>\n<td>11<\/td>\n<td>863a48e36413feba8bb299623dbc9b20<\/td>\n<td>174<\/td>\n<\/tr>\n<tr>\n<td>12<\/td>\n<td>2482d2afd404031c67adb9cbc012768b<\/td>\n<td>174<\/td>\n<\/tr>\n<tr>\n<td>13<\/td>\n<td>4728096fca2b3575800dafbdebf4276a<\/td>\n<td>170<\/td>\n<\/tr>\n<tr>\n<td>14<\/td>\n<td>bf8b05684375b26205e50fa27317057e<\/td>\n<td>157<\/td>\n<\/tr>\n<tr>\n<td>15<\/td>\n<td>fd114ee6b71ee06738b5b547b00e8102<\/td>\n<td>156<\/td>\n<\/tr>\n<tr>\n<td>16<\/td>\n<td>df1c43e5a72e92d11bdefcead13a5e14<\/td>\n<td>156<\/td>\n<\/tr>\n<tr>\n<td>17<\/td>\n<td>094afc30995ff28993ec5326e8b3c4d4<\/td>\n<td>156<\/td>\n<\/tr>\n<tr>\n<td>18<\/td>\n<td>042490db7093660e74a762447f64f950<\/td>\n<td>156<\/td>\n<\/tr>\n<tr>\n<td>19<\/td>\n<td>5c5979ec3533f13b22153de05ffc64d5<\/td>\n<td>154<\/td>\n<\/tr>\n<tr>\n<td>20<\/td>\n<td>50645492c50621c0847c4ebd1fdd65cd<\/td>\n<td>154<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  <\/p>\n<ol>\n<li>\n<p>12f746f2689073d5c949998e0216f68a, 1377 identical, function names usually: <code>_interopRequireDefault<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function MORK(e){return e&amp;&amp;e.__esModule?e:{default:e}}<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>285d00ca29fcc46aa113c7aefc63827d, 1243 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(){};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>3f993321f73e83f277c20c178e5587b9, 989 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(){return data};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>54782ec6cef850906484808b86946b33, 299 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=()=>{};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>7d1e7aad635be0f7382696c4f846beae, 278 identical, function names: <code>emptyFunction<\/code>, <code>Generator<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function MORK(){}<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>d11004e998280b565ad084b0ad5ca214, 239 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(){return cache};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>a02c66d8928b3353552e4804c6714326, 237 identical, function names: <code>_getRequireWildcardCache<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function MORK(){if(\"function\"!=typeof WeakMap)return null;var e=new WeakMap;return _getRequireWildcardCache=function(){return e},e}<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>79e9bd3cdf15cf0af97f73ccaed50fa0, 231 identical, function names <code>_interopRequireWildcard<\/code><\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">function MORK(e){if(e&amp;&amp;e.__esModule)return e;if(null===e||\"object\"!=typeof e&amp;&amp;\"function\"!=typeof e)return{default:e};var t=_getRequireWildcardCache();if(t&amp;&amp;t.has(e))return t.get(e);var r,n,o={},c=Object.defineProperty&amp;&amp;Object.getOwnPropertyDescriptor;for(r in e)Object.prototype.hasOwnProperty.call(e,r)&amp;&amp;((n=c?Object.getOwnPropertyDescriptor(e,r):null)&amp;&amp;(n.get||n.set)?Object.defineProperty(o,r,n):o[r]=e[r]);return o.default=e,t&amp;&amp;t.set(e,o),o}<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>7d6f69751712ef9fa94238b38120adc6, 189 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(){return this};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>b8dd34af96b042c23a4be7f82c881fe4, 176 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(n,o,c,i){n[i=void 0===i?c:i]=o[c]};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>863a48e36413feba8bb299623dbc9b20, 174 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(e,n,t,o){void 0===o&amp;&amp;(o=t),Object.defineProperty(e,o,{enumerable:!0,get:function(){return n[t]}})};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>2482d2afd404031c67adb9cbc012768b, 174 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(){return m[k]};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>4728096fca2b3575800dafbdebf4276a, 170 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(n){return n};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>bf8b05684375b26205e50fa27317057e, 157 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=s=>exposed.has(s);<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>fd114ee6b71ee06738b5b547b00e8102, 156 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=(r,e,p)=>{var t=makeWrapper(r);return exports.setup(t,r,e,p)};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>df1c43e5a72e92d11bdefcead13a5e14, 156 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=t=>utils.isObject(t)&amp;&amp;t instanceof Impl.implementation;<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>094afc30995ff28993ec5326e8b3c4d4, 156 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=i=>utils.isObject(i)&amp;&amp;utils.hasOwn(i,implSymbol)&amp;&amp;i[implSymbol]instanceof Impl.implementation;<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>042490db7093660e74a762447f64f950, 156 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=(r,e,t)=>{t=exports.create(r,e,t);return utils.implForWrapper(t)};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>5c5979ec3533f13b22153de05ffc64d5, 154 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(e){if(e&amp;&amp;e.__esModule)return e;var t={};if(null!=e)for(var r in e)\"default\"!==r&amp;&amp;Object.prototype.hasOwnProperty.call(e,r)&amp;&amp;__createBinding(t,e,r);return __setModuleDefault(t,e),t};<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>50645492c50621c0847c4ebd1fdd65cd, 154 identical<\/p>\n<p>  <\/p>\n<pre><code class=\"javascript\">const z=function(e,n){Object.defineProperty(e,\"default\",{enumerable:!0,value:n})};<\/code><\/pre>\n<p>  <\/li>\n<\/ol>\n<p>  <\/p>\n<h3 id=\"which-files-use-function-8-79e9bd3cdf15cf0af97f73ccaed50fa0\">Which files use function 8 (79e9bd3cdf15cf0af97f73ccaed50fa0)<\/h3>\n<p>  <\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">View file list<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<p>The list is long<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">\/jest-worker\/build\/base\/BaseWorkerPool.js \/@svgr\/hast-util-to-babel-ast\/lib\/index.js \/@svgr\/hast-util-to-babel-ast\/lib\/handlers.js \/@svgr\/hast-util-to-babel-ast\/lib\/stringToObjectStyle.js \/@svgr\/hast-util-to-babel-ast\/lib\/getAttributes.js \/babel-jest\/node_modules\/@babel\/core\/lib\/transform-file.js \/babel-jest\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/babel-jest\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/babel-jest\/node_modules\/@babel\/core\/lib\/config\/full.js \/babel-jest\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/babel-jest\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/babel-jest\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/babel-jest\/node_modules\/@babel\/core\/lib\/index.js \/jest-pnp-resolver\/node_modules\/jest-resolve\/build\/defaultResolver.js \/jest-pnp-resolver\/node_modules\/jest-resolve\/build\/ModuleNotFoundError.js \/jest-circus\/build\/utils.js \/jest-haste-map\/build\/ModuleMap.js \/jest-haste-map\/build\/lib\/normalizePathSep.js \/jest-haste-map\/build\/lib\/fast_path.js \/jest-haste-map\/build\/lib\/WatchmanWatcher.js \/jest-haste-map\/build\/worker.js \/jest-haste-map\/build\/getMockName.js \/jest-haste-map\/build\/HasteFS.js \/jest-haste-map\/build\/crawlers\/watchman.js \/jest-jasmine2\/build\/index.js \/eslint\/node_modules\/@babel\/code-frame\/lib\/index.js \/mini-css-extract-plugin\/dist\/index.js \/react-scripts\/node_modules\/@babel\/core\/lib\/transform-file.js \/react-scripts\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/react-scripts\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/react-scripts\/node_modules\/@babel\/core\/lib\/config\/full.js \/react-scripts\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/react-scripts\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/react-scripts\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/react-scripts\/node_modules\/@babel\/core\/lib\/index.js \/react-scripts\/node_modules\/jest-resolve\/build\/defaultResolver.js \/react-scripts\/node_modules\/jest-resolve\/build\/ModuleNotFoundError.js \/eslint-plugin-flowtype\/dist\/utilities\/index.js \/jest-util\/build\/index.js \/jest-util\/build\/createDirectory.js \/jest-util\/build\/installCommonGlobals.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx-development\/node_modules\/@babel\/core\/lib\/transform-file.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx-development\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx-development\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx-development\/node_modules\/@babel\/core\/lib\/config\/full.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx-development\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx-development\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx-development\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx-development\/node_modules\/@babel\/core\/lib\/index.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-pure-annotations\/node_modules\/@babel\/core\/lib\/transform-file.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-pure-annotations\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-pure-annotations\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-pure-annotations\/node_modules\/@babel\/core\/lib\/config\/full.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-pure-annotations\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-pure-annotations\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-pure-annotations\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-pure-annotations\/node_modules\/@babel\/core\/lib\/index.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx\/node_modules\/@babel\/core\/lib\/transform-file.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx\/node_modules\/@babel\/core\/lib\/config\/full.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/babel-preset-react-app\/node_modules\/@babel\/plugin-transform-react-jsx\/node_modules\/@babel\/core\/lib\/index.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-class-properties\/node_modules\/@babel\/core\/lib\/transform-file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-class-properties\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-class-properties\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-class-properties\/node_modules\/@babel\/core\/lib\/config\/full.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-class-properties\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-class-properties\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-class-properties\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-class-properties\/node_modules\/@babel\/core\/lib\/index.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-optional-chaining\/node_modules\/@babel\/core\/lib\/transform-file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-optional-chaining\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-optional-chaining\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-optional-chaining\/node_modules\/@babel\/core\/lib\/config\/full.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-optional-chaining\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-optional-chaining\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-optional-chaining\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-optional-chaining\/node_modules\/@babel\/core\/lib\/index.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-nullish-coalescing-operator\/node_modules\/@babel\/core\/lib\/transform-file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-nullish-coalescing-operator\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-nullish-coalescing-operator\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-nullish-coalescing-operator\/node_modules\/@babel\/core\/lib\/config\/full.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-nullish-coalescing-operator\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-nullish-coalescing-operator\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-nullish-coalescing-operator\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-nullish-coalescing-operator\/node_modules\/@babel\/core\/lib\/index.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-numeric-separator\/node_modules\/@babel\/core\/lib\/transform-file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-numeric-separator\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-numeric-separator\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-numeric-separator\/node_modules\/@babel\/core\/lib\/config\/full.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-numeric-separator\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-numeric-separator\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-numeric-separator\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/node_modules\/@babel\/plugin-proposal-numeric-separator\/node_modules\/@babel\/core\/lib\/index.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/lib\/targets-parser.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/lib\/index.js \/babel-preset-react-app\/node_modules\/@babel\/preset-env\/lib\/utils.js \/babel-preset-react-app\/node_modules\/@babel\/preset-react\/node_modules\/@babel\/plugin-transform-react-display-name\/node_modules\/@babel\/core\/lib\/transform-file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-react\/node_modules\/@babel\/plugin-transform-react-display-name\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/babel-preset-react-app\/node_modules\/@babel\/preset-react\/node_modules\/@babel\/plugin-transform-react-display-name\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/babel-preset-react-app\/node_modules\/@babel\/preset-react\/node_modules\/@babel\/plugin-transform-react-display-name\/node_modules\/@babel\/core\/lib\/config\/full.js \/babel-preset-react-app\/node_modules\/@babel\/preset-react\/node_modules\/@babel\/plugin-transform-react-display-name\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-react\/node_modules\/@babel\/plugin-transform-react-display-name\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/babel-preset-react-app\/node_modules\/@babel\/preset-react\/node_modules\/@babel\/plugin-transform-react-display-name\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/babel-preset-react-app\/node_modules\/@babel\/preset-react\/node_modules\/@babel\/plugin-transform-react-display-name\/node_modules\/@babel\/core\/lib\/index.js \/babel-preset-react-app\/node_modules\/@babel\/core\/lib\/transform-file.js \/babel-preset-react-app\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/babel-preset-react-app\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/babel-preset-react-app\/node_modules\/@babel\/core\/lib\/config\/full.js \/babel-preset-react-app\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/babel-preset-react-app\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/babel-preset-react-app\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/babel-preset-react-app\/node_modules\/@babel\/core\/lib\/index.js \/@babel\/code-frame\/lib\/index.js \/@babel\/traverse\/lib\/path\/inference\/inferer-reference.js \/@babel\/traverse\/lib\/path\/inference\/inferers.js \/@babel\/traverse\/lib\/path\/inference\/index.js \/@babel\/traverse\/lib\/path\/comments.js \/@babel\/traverse\/lib\/path\/replacement.js \/@babel\/traverse\/lib\/path\/ancestry.js \/@babel\/traverse\/lib\/path\/conversion.js \/@babel\/traverse\/lib\/path\/index.js \/@babel\/traverse\/lib\/path\/introspection.js \/@babel\/traverse\/lib\/path\/removal.js \/@babel\/traverse\/lib\/path\/lib\/hoister.js \/@babel\/traverse\/lib\/path\/lib\/virtual-types.js \/@babel\/traverse\/lib\/path\/modification.js \/@babel\/traverse\/lib\/path\/family.js \/@babel\/traverse\/lib\/path\/generated\/asserts.js \/@babel\/traverse\/lib\/path\/generated\/validators.js \/@babel\/traverse\/lib\/path\/generated\/virtual-types.js \/@babel\/traverse\/lib\/index.js \/@babel\/traverse\/lib\/visitors.js \/@babel\/traverse\/lib\/context.js \/@babel\/traverse\/lib\/scope\/index.js \/@babel\/traverse\/lib\/scope\/lib\/renamer.js \/@babel\/traverse\/lib\/types.js \/@babel\/helper-hoist-variables\/lib\/index.js \/@babel\/helper-wrap-function\/lib\/index.js \/@babel\/helper-builder-binary-assignment-operator-visitor\/lib\/index.js \/@babel\/helper-explode-assignable-expression\/lib\/index.js \/@babel\/helper-replace-supers\/lib\/index.js \/@babel\/helper-module-imports\/lib\/import-builder.js \/@babel\/helper-module-imports\/lib\/import-injector.js \/@babel\/helper-skip-transparent-expression-wrappers\/lib\/index.js \/@babel\/helper-compilation-targets\/lib\/index.js \/@babel\/types\/lib\/definitions\/jsx.js \/@babel\/types\/lib\/definitions\/misc.js \/@babel\/types\/lib\/definitions\/typescript.js \/@babel\/types\/lib\/definitions\/flow.js \/@babel\/types\/lib\/definitions\/experimental.js \/@babel\/types\/lib\/definitions\/core.js \/@babel\/types\/lib\/index.js \/@babel\/helpers\/lib\/index.js \/@babel\/helper-remap-async-to-generator\/lib\/index.js \/@babel\/helper-split-export-declaration\/lib\/index.js \/@babel\/helper-simple-access\/lib\/index.js \/@babel\/helper-module-transforms\/lib\/rewrite-this.js \/@babel\/helper-module-transforms\/lib\/rewrite-live-references.js \/@babel\/helper-module-transforms\/lib\/index.js \/@babel\/preset-env\/lib\/targets-parser.js \/@babel\/preset-env\/lib\/index.js \/@babel\/preset-env\/lib\/utils.js \/@babel\/highlight\/lib\/index.js \/@babel\/generator\/lib\/generators\/jsx.js \/@babel\/generator\/lib\/generators\/base.js \/@babel\/generator\/lib\/generators\/template-literals.js \/@babel\/generator\/lib\/generators\/typescript.js \/@babel\/generator\/lib\/generators\/classes.js \/@babel\/generator\/lib\/generators\/expressions.js \/@babel\/generator\/lib\/generators\/statements.js \/@babel\/generator\/lib\/generators\/flow.js \/@babel\/generator\/lib\/generators\/modules.js \/@babel\/generator\/lib\/generators\/types.js \/@babel\/generator\/lib\/generators\/methods.js \/@babel\/generator\/lib\/node\/parentheses.js \/@babel\/generator\/lib\/node\/index.js \/@babel\/generator\/lib\/node\/whitespace.js \/@babel\/generator\/lib\/printer.js \/@babel\/helper-get-function-arity\/lib\/index.js \/@babel\/helper-function-name\/lib\/index.js \/@babel\/helper-annotate-as-pure\/lib\/index.js \/@babel\/helper-create-class-features-plugin\/node_modules\/@babel\/core\/lib\/transform-file.js \/@babel\/helper-create-class-features-plugin\/node_modules\/@babel\/core\/lib\/config\/files\/configuration.js \/@babel\/helper-create-class-features-plugin\/node_modules\/@babel\/core\/lib\/config\/files\/utils.js \/@babel\/helper-create-class-features-plugin\/node_modules\/@babel\/core\/lib\/config\/full.js \/@babel\/helper-create-class-features-plugin\/node_modules\/@babel\/core\/lib\/transformation\/normalize-file.js \/@babel\/helper-create-class-features-plugin\/node_modules\/@babel\/core\/lib\/transformation\/file\/file.js \/@babel\/helper-create-class-features-plugin\/node_modules\/@babel\/core\/lib\/tools\/build-external-helpers.js \/@babel\/helper-create-class-features-plugin\/node_modules\/@babel\/core\/lib\/index.js \/@babel\/helper-create-class-features-plugin\/lib\/fields.js \/@babel\/plugin-transform-classes\/lib\/transformClass.js \/@babel\/template\/lib\/parse.js \/@babel\/template\/lib\/formatters.js \/@babel\/template\/lib\/populate.js \/@babel\/template\/lib\/index.js \/@babel\/core\/lib\/transform-file.js \/@babel\/core\/lib\/config\/files\/configuration.js \/@babel\/core\/lib\/config\/files\/utils.js \/@babel\/core\/lib\/config\/full.js \/@babel\/core\/lib\/transformation\/normalize-file.js \/@babel\/core\/lib\/transformation\/file\/file.js \/@babel\/core\/lib\/tools\/build-external-helpers.js \/@babel\/core\/lib\/index.js \/@babel\/helper-optimise-call-expression\/lib\/index.js \/jest-snapshot\/build\/SnapshotResolver.js \/jest-snapshot\/build\/State.js \/jest-snapshot\/build\/index.js \/jest-serializer\/build\/index.js \/react-dev-utils\/node_modules\/@babel\/code-frame\/lib\/index.js \/jest-resolve\/build\/defaultResolver.js \/jest-resolve\/build\/ModuleNotFoundError.js \/pretty-format\/build\/plugins\/ReactElement.js \/jest-each\/build\/table\/array.js \/@jest\/transform\/build\/shouldInstrument.js \/@jest\/transform\/build\/index.js \/@jest\/reporters\/build\/NotifyReporter.js \/@jest\/reporters\/build\/CoverageWorker.js \/@jest\/reporters\/build\/utils.js \/@jest\/reporters\/build\/generateEmptyCoverage.js \/@jest\/core\/build\/collectHandles.js \/@jest\/core\/build\/watch.js \/@testing-library\/react\/dist\/@testing-library\/react.umd.js \/@testing-library\/react\/dist\/@testing-library\/react.pure.umd.js \/@testing-library\/dom\/dist\/@testing-library\/dom.umd.js \/jest-config\/build\/getCacheDirectory.js \/jest-config\/build\/resolveConfigPath.js \/jest-config\/build\/constants.js<\/code><\/pre>\n<\/div><\/div>\n<p>  <\/p>\n<h2 id=\"sonclusions\">\u0421onclusions?<\/h2>\n<p>  <\/p>\n<p>Perhaps this little research will give someone thoughts about refactoring. Or changing the programming approach.<\/p>\n<p>  <\/p>\n<p>It is good that people use some common approaches and patterns for programming.<\/p>\n<p>  <\/p>\n<p>It&#8217;s bad that there is a lot of copy-paste.<\/p>\n<p>  <\/p>\n<h4 id=\"ps\">P.S.<\/h4>\n<p>  <\/p>\n<p>Used scripts can be found on <a href=\"https:\/\/github.com\/gurov\/identical-functions\" rel=\"nofollow noopener noreferrer\">GitHub<\/a><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/554334\/\"> https:\/\/habr.com\/ru\/articles\/554334\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>Only <strong>39%<\/strong> of the functions in <code>node_modules<\/code> are unique in the default Angular project created by <code>ng new my-app<\/code>.<\/p>\n<p>  <\/p>\n<p>I think the developers of open source solve problems in the same ways, because they study the same algorithms. Well, why be honest, they copy the popular solutions from StackOverflow also.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/webt\/yc\/dp\/cj\/ycdpcjo5oq8py5hwvekc4spkggs.jpeg\" data-src=\"https:\/\/habrastorage.org\/webt\/yc\/dp\/cj\/ycdpcjo5oq8py5hwvekc4spkggs.jpeg\" data-blurred=\"true\"\/><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-410319","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/410319","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=410319"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/410319\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=410319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=410319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=410319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}