{"id":329850,"date":"2022-02-19T09:00:36","date_gmt":"2022-02-19T09:00:36","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=329850"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=329850","title":{"rendered":"<span>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Typescript \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c Nx<\/span>"},"content":{"rendered":"<div><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Nx \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Typescript.<\/p>\n<p>\u0414\u0432\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430 \u043c\u0435\u0434\u0438\u0443\u043c\u0435 &#8212; <a href=\"https:\/\/medium.com\/fafnur\/%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-typescript-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-webpack-8cd04eba6a8f\" rel=\"noopener noreferrer nofollow\">\u0421\u0431\u043e\u0440\u043a\u0430 Typescript \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Webpack<\/a>, \u0433\u0434\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Typescript \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/webpack.js.org\/\" rel=\"noopener noreferrer nofollow\">Webpack<\/a>.\u00a0<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/28f\/a63\/b20\/28fa63b20ae71ac4ea61c25231fe5758.png\" width=\"1878\" height=\"729\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/28f\/a63\/b20\/28fa63b20ae71ac4ea61c25231fe5758.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0432\u0441\u0435 \u0431\u044b \u043d\u0438\u0447\u0435\u0433\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u044d\u0442\u043e \u043d\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e. \u0412\u0441\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440, \u043d\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043e\u0431 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438 \u043f\u043e\u0439\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0439 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440.<\/p>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/h2>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0435\u0445 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u043e\u0434\u0438\u043d \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0438\u043d. \u0442\u0435\u0445 \u0441\u0442\u0430\u0440\u0442\u0430\u043f Angular \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c. \u0418 \u043f\u043e \u043c\u0435\u0440\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u043d\u0435\u043a\u043e\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u043b\u043e \u0431\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c:<\/p>\n<ul>\n<li>\n<p>\u042f\u0437\u044b\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Typescript;<\/p>\n<\/li>\n<li>\n<p>Livereload \u043f\u0440\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c &#171;prod&#187; \u0441\u0431\u043e\u0440\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434.\u00a0<\/p>\n<\/li>\n<\/ul>\n<blockquote>\n<p>\u041e\u0434\u043d\u0438\u043c \u0441\u043b\u043e\u0432\u043e\u043c \u0432\u0441\u0435 \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 JS \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445.\u00a0<\/p>\n<\/blockquote>\n<p>\u042f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 github\u2019\u0435, \u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u043b\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043b\u0438\u0431\u043e \u043e\u043d\u0438 \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438\u0441\u044c, \u043b\u0438\u0431\u043e \u0431\u044b\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u044b. \u041c\u043d\u0435 \u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435.\u00a0<\/p>\n<p>\u042f \u0431\u044b\u043b \u0437\u043d\u0430\u043a\u043e\u043c \u0441 webpack \u0438 \u043c\u043d\u0435 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u0442\u0440\u0443\u0434\u0430 \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u043b\u0430 \u0432\u044b\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c.\u00a0<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u0437\u0430 \u043e\u0434\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c, \u0447\u0442\u043e \u0435\u0433\u043e \u0442\u0440\u0443\u0434\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c. \u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u043b\u0441\u044f, \u0442\u043e \u044f\u0432\u043d\u043e\u0433\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c 5 &#8212; 10 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0435 \u0431\u044b\u043b\u043e. <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0436\u0438\u043b\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043a\u043e\u043f\u0438\u0440\u0443\u044f \u043a\u0443\u0441\u043a\u0438 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0435. \u0412 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u0434\u0430\u0436\u0435 \u043f\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u043b \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0432\u043e\u0435\u0433\u043e CLI, \u043d\u043e \u0441\u0430\u043c\u0430 \u043c\u044b\u0441\u043b\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u044f\u0432\u043d\u043e \u043a\u0440\u0438\u0447\u0430\u043b\u0430 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u044e \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a.\u00a0<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u044f \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Nx \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 Angular \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<\/p>\n<h2>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e Nx<\/h2>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b32\/a49\/25d\/b32a4925d49150eb3e5ad6cb34a64347.png\" width=\"1397\" height=\"945\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b32\/a49\/25d\/b32a4925d49150eb3e5ad6cb34a64347.png\"\/><figcaption><\/figcaption><\/figure>\n<p>Nx \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c.\u00a0\u0421 Nx \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 <a href=\"https:\/\/nx.dev\/getting-started\/intro.\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 typescript \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b &#8212;\u00a0<a href=\"https:\/\/nx.dev\/getting-started\/nx-and-typescript\" rel=\"noopener noreferrer nofollow\">Nx \u0438 TypeScript<\/a>.<\/p>\n<blockquote>\n<p>\u0412 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0447\u0430\u0441\u0442\u044c Angular Team \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e <a href=\"https:\/\/nrwl.io\/\" rel=\"noopener noreferrer nofollow\">Nrwl<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439  \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 <a href=\"https:\/\/angular.io\/\" rel=\"noopener noreferrer nofollow\">Angular<\/a>. \u041a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 Fortune 500 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e Angular, \u0430 \u0442\u0430\u043a\u0436\u0435 React, Vue \u0438 \u0447\u0438\u0441\u0442\u044b\u0439 Typescript.<\/p>\n<\/blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c, \u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Nx \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0440\u043e\u043b\u0438\u043a\u0438 \u0441 \u043e\u0431\u0437\u043e\u0440\u043e\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f.\u00a0\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u043e\u043b\u0438\u043a \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/620f38a1e635030b64de7fe9\" data-style=\"\" id=\"620f38a1e635030b64de7fe9\" width=\"\"><\/div>\n<p>\u0412\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Nx:<\/p>\n<ul>\n<li>\n<p>\u0432\u0441\u044f \u043c\u043e\u0449\u044c typescript \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 eslint;<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0435\u0434\u0438\u043d\u043e\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b &#8212; \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u0440\u0435\u043b\u0438\u0437\u0430 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 &#8212; \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, Nx \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u043c\u0443 \u0432\u0438\u0434\u0443;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 React, Angular, Vue \u0438 Svetle.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e Nx.<\/p>\n<blockquote>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, NX &#8212; \u043d\u0430\u0431\u043e\u0440 \u0443\u0442\u0438\u043b\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430 \u0432\u0430\u0441, \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0432 \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445, \u043a\u043e\u043d\u0435\u0447\u043d\u043e.<\/p>\n<\/blockquote>\n<h2>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/h2>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 nx \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0430\u044f NodeJS \u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a <code>npm<\/code> \u0438\u043b\u0438 <code>yarn<\/code>.<\/p>\n<blockquote>\n<p><em>\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 NodeJS \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 &#8212; <\/em><a href=\"https:\/\/nodejs.org\/en\/docs\/\" rel=\"noopener noreferrer nofollow\"><em><u>https:\/\/nodejs.org\/en\/docs<\/u><\/em><\/a><em><u>.<\/u><\/em><\/p>\n<\/blockquote>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c nx, \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c nx cli \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"bash\">yarn global add \/cli<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b nx \u0431\u0435\u0437 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (yarn \u0438\u043b\u0438 npm):<\/p>\n<pre><code class=\"bash\">nx g lib mylib<\/code><\/pre>\n<p>\u0418\u043d\u0430\u0447\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c:<\/p>\n<pre><code class=\"bash\">yarn nx g lib mylib<\/code><\/pre>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 workspace \u0434\u043b\u044f typescript \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 Nx workspace \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">npx create-nx-workspace@latest<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 <code>yarn<\/code>, \u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">yarn create nx-workspace --package-manager=yarn\u00a0<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/50c\/96e\/098\/50c96e0989572e146e9fba6a06c49c04.png\" alt=\"\u0417\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Nx workspace\" title=\"\u0417\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Nx workspace\" width=\"1242\" height=\"216\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/50c\/96e\/098\/50c96e0989572e146e9fba6a06c49c04.png\"\/><figcaption>\u0417\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Nx workspace<\/figcaption><\/figure>\n<p>\u0412\u0432\u0435\u0434\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 workspace &#8212; <code>boobs<\/code>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/453\/8c3\/9a8\/4538c39a8df44f747a1ec6f6659f8c25.png\" alt=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 boobs Nx workspace\" title=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 boobs Nx workspace\" width=\"1305\" height=\"208\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/453\/8c3\/9a8\/4538c39a8df44f747a1ec6f6659f8c25.png\"\/><figcaption>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 boobs Nx workspace<\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 workspace \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0438\u043f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (<code>angular<\/code>, <code>react<\/code>, <code>node<\/code> \u0438\u043b\u0438 <code>typescript<\/code>). \u0414\u0430\u043d\u043d\u0430\u044f \u043e\u043f\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432 <code>package.json.<\/code><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0435\u043c <code>ts<\/code>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f9d\/854\/8ba\/f9d8548babae6206a67234b6ddba3d78.png\" alt=\"\u0412\u044b\u0431\u043e\u0440 \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Nx\" title=\"\u0412\u044b\u0431\u043e\u0440 \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Nx\" width=\"1235\" height=\"456\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f9d\/854\/8ba\/f9d8548babae6206a67234b6ddba3d78.png\"\/><figcaption>\u0412\u044b\u0431\u043e\u0440 \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Nx<\/figcaption><\/figure>\n<p>\u041e\u0442\u043a\u0430\u0436\u0435\u043c\u0441\u044f \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u043a\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/231\/230\/e7e\/231230e7e2f823984f280e7319fe19a4.png\" alt=\"\u041e\u043f\u0446\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Nx Cloud\" title=\"\u041e\u043f\u0446\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Nx Cloud\" width=\"1356\" height=\"286\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/231\/230\/e7e\/231230e7e2f823984f280e7319fe19a4.png\"\/><figcaption>\u041e\u043f\u0446\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Nx Cloud<\/figcaption><\/figure>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0431\u043e\u0438\u0442\u0435\u0441\u044c \u0441\u0442\u0430\u0442\u044c <a href=\"https:\/\/adventuretime.fandom.com\/ru\/wiki\/%D0%9F%D1%83%D0%BF%D1%8B%D1%80%D1%87%D0%B0%D1%82%D1%8B%D0%B5_%D0%BB%D1%8E%D0%B4%D0%B8\" rel=\"noopener noreferrer nofollow\">\u043f\u0443\u043f\u044b\u0440\u043a\u043e\u0439<\/a>, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u043e.<\/p>\n<\/blockquote>\n<p>\u0414\u0430\u043b\u0435\u0435 Nx \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/503\/fe3\/7b8\/503fe37b828d0c39d7fe04a38b74fe7c.png\" width=\"1410\" height=\"394\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/503\/fe3\/7b8\/503fe37b828d0c39d7fe04a38b74fe7c.png\"\/><figcaption><\/figcaption><\/figure>\n<p>Nx \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043f\u0440\u043e\u0439\u0442\u0438 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \ud83d\ude42<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/19b\/7b2\/306\/19b7b2306395f5846fe78289de2de9b3.png\" width=\"1428\" height=\"596\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/19b\/7b2\/306\/19b7b2306395f5846fe78289de2de9b3.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c:<\/p>\n<pre><code class=\"bash\">cd boobs<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043b Nx, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>ls<\/code>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/604\/ee3\/a72\/604ee3a721d09bc78e4a66e86be8118d.png\" width=\"1381\" height=\"85\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/604\/ee3\/a72\/604ee3a721d09bc78e4a66e86be8118d.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043b\u044e\u0431\u0438\u043c\u043e\u0439 <a href=\"https:\/\/www.jetbrains.com\/webstorm\/\" rel=\"noopener noreferrer nofollow\">IDE<\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/238\/e8a\/228\/238e8a2285d57f9fc48220a5de67d950.png\" width=\"1916\" height=\"974\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/238\/e8a\/228\/238e8a2285d57f9fc48220a5de67d950.png\"\/><figcaption><\/figcaption><\/figure>\n<blockquote>\n<p><a href=\"https:\/\/www.jetbrains.com\/\" rel=\"noopener noreferrer nofollow\">JetBrains<\/a>, \u043a \u043c\u043e\u0435\u043c\u0443 \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 <s>\u043f\u043e\u0434\u043e\u0433\u043d\u0430\u0442\u044c<\/s> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u043d\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e. \u0412\u0438\u0434\u0438\u043c\u043e \u0441\u043a\u043e\u0440\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/code.visualstudio.com\/\" rel=\"noopener noreferrer nofollow\">VSCode<\/a>.<\/p>\n<\/blockquote>\n<p>\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e Nx \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<pre><code>boobs\/ \u251c\u2500\u2500 packages\/ \u251c\u2500\u2500 tools\/ \u251c\u2500\u2500 workspace.json \u251c\u2500\u2500 nx.json \u251c\u2500\u2500 package.json \u2514\u2500\u2500 tsconfig.base.json<\/code><\/pre>\n<p>\u041e\u0442\u043a\u0440\u043e\u0435\u043c <code>package.json<\/code>:<\/p>\n<pre><code class=\"json\">{   \"name\": \"boobs\",   \"version\": \"0.0.0\",   \"license\": \"MIT\",   \"scripts\": {},   \"private\": true,   \"dependencies\": {},   \"devDependencies\": {     \"@nrwl\/cli\": \"13.8.2\",     \"@nrwl\/js\": \"13.8.2\",     \"@nrwl\/tao\": \"13.8.2\",     \"@nrwl\/workspace\": \"13.8.2\",     \"@types\/node\": \"16.11.7\",     \"prettier\": \"^2.5.1\",     \"typescript\": \"~4.5.2\"   } }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f, Nx \u0441\u043e\u0437\u0434\u0430\u043b \u043d\u043e\u0432\u044b\u0439, \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u0430\u043a\u0435\u0442\u044b <code>@nrwl<\/code> \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u0433\u0434\u0435 \u043b\u0438\u0431\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442 <code>cli<\/code>, \u043b\u0438\u0431\u043e <code>js<\/code>, \u043b\u0438\u0431\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0433\u043e <code>workspace<\/code>.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0430\u0439\u043b <code>nx.json<\/code>:<\/p>\n<pre><code class=\"json\">{   \"extends\": \"@nrwl\/workspace\/presets\/core.json\",   \"npmScope\": \"boobs\",   \"affected\": {     \"defaultBase\": \"main\"   },   \"cli\": {     \"defaultCollection\": \"@nrwl\/workspace\"   },   \"tasksRunnerOptions\": {     \"default\": {       \"runner\": \"@nrwl\/workspace\/tasks-runners\/default\",       \"options\": {         \"cacheableOperations\": [           \"build\",           \"lint\",           \"test\",           \"e2e\"         ]       }     }   } }<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u043c\u0435\u0435\u043c 3 \u0441\u0435\u043a\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><code>affected<\/code> &#8212; \u0432\u0435\u0442\u043a\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c, \u0438 \u043a\u0430\u043a\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430  (\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438) \u0431\u044b\u043b\u0438 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043f\u0440\u0430\u0432\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p><code>cli<\/code> &#8212; \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 CLI. \u041e\u0431\u044b\u0447\u043d\u043e, \u0442\u0430\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 nx. \u0415\u0441\u043b\u0438 \u0432\u044b \u0444\u0430\u043d\u0430\u0442\u0438\u043a yarn, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>\"packageManager\": \"yarn\"<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435\u0433\u0434\u0430 <code>yarn<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><code>tasksRunnerOptions<\/code> &#8212; \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0430\u0432\u0438\u043b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u0414\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0424\u0430\u0439\u043b <code>workspace.json<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u0443\u0442\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"json\">{   \"version\": 2,   \"projects\": {} }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0444\u0430\u0439\u043b \u044d\u0442\u043e <code>tsconfig.base.json<\/code>:<\/p>\n<pre><code class=\"json\">{   \"compileOnSave\": false,   \"compilerOptions\": {     \"rootDir\": \".\",     \"sourceMap\": true,     \"declaration\": false,     \"moduleResolution\": \"node\",     \"emitDecoratorMetadata\": true,     \"experimentalDecorators\": true,     \"importHelpers\": true,     \"target\": \"es2015\",     \"module\": \"esnext\",     \"lib\": [\"es2017\", \"dom\"],     \"skipLibCheck\": true,     \"skipDefaultLibCheck\": true,     \"baseUrl\": \".\",     \"paths\": {}   },   \"exclude\": [\"node_modules\", \"tmp\"] }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e. \u041c\u043e\u0436\u043d\u043e \u0431\u0430\u043c\u043f\u043d\u0443\u0442\u044c es \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 &#8212; \u044d\u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 <code>eslint<\/code>. <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c <code>eslint<\/code> \u0432 workspace:<\/p>\n<pre><code class=\"bash\">yarn add --dev @nrwl\/linter yarn add --dev @nrwl\/eslint-plugin-nx<\/code><\/pre>\n<blockquote>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0433 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, Nx \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430 \u0432\u0430\u0441, \u0438 \u0441\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442 eslint \u0438 jest.<\/p>\n<\/blockquote>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 NX workspace<\/h2>\n<p>\u0412 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 &#8212; \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 npmjs<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f &#8212; \u0442\u043e\u0436\u0435 \u0447\u0442\u043e \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#8212; store:<\/p>\n<pre><code>nx generate @nrwl\/js:app store<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e3e\/e1f\/31b\/e3ee1f31b7042d0f8dd7fa6a8c10364b.png\" width=\"1381\" height=\"512\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e3e\/e1f\/31b\/e3ee1f31b7042d0f8dd7fa6a8c10364b.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><code>.eslintrc.json<\/code> &#8212; \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u0438\u043d\u0442\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p><code>jest.config.js<\/code>, <code>jest.preset.js<\/code> &#8212; \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u043b\u044f unit \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e jest<\/p>\n<\/li>\n<\/ul>\n<p>Workspace.json \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"json\">{   \"version\": 2,   \"projects\": {     \"store\": \"packages\/store\"   } } <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e jest, Nx \u043b\u044e\u0431\u0435\u0437\u043d\u043e \u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b, \u043e\u0431\u043d\u043e\u0432\u0438\u0432 <code>package.json<\/code>:<\/p>\n<pre><code class=\"json\">{   \"name\": \"boobs\",   \"version\": \"0.0.0\",   \"license\": \"MIT\",   \"scripts\": {},   \"private\": true,   \"dependencies\": {     \"tslib\": \"^2.0.0\"   },   \"devDependencies\": {     \"@nrwl\/cli\": \"13.8.2\",     \"@nrwl\/eslint-plugin-nx\": \"^13.8.2\",     \"@nrwl\/jest\": \"13.8.2\",     \"@nrwl\/js\": \"13.8.2\",     \"@nrwl\/linter\": \"^13.8.2\",     \"@nrwl\/tao\": \"13.8.2\",     \"@nrwl\/workspace\": \"13.8.2\",     \"@types\/jest\": \"27.0.2\",     \"@types\/node\": \"16.11.7\",     \"@typescript-eslint\/eslint-plugin\": \"~5.10.0\",     \"@typescript-eslint\/parser\": \"~5.10.0\",     \"eslint\": \"~8.7.0\",     \"eslint-config-prettier\": \"8.1.0\",     \"jest\": \"27.2.3\",     \"prettier\": \"^2.5.1\",     \"ts-jest\": \"27.0.5\",     \"typescript\": \"~4.5.2\"   } } <\/code><\/pre>\n<blockquote>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 package.json, \u043d\u0443 \u0434\u0430 \u043b\u0430\u0434\u043d\u043e.<\/p>\n<\/blockquote>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"json\">nx serve store<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dcf\/b13\/3d2\/dcfb133d293a6f673e617c534f0018bc.png\" width=\"1173\" height=\"208\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dcf\/b13\/3d2\/dcfb133d293a6f673e617c534f0018bc.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e livereload \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0432 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0442\u043e \u0442\u0430\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/p>\n<pre><code class=\"bash\">packages\/store \u251c\u2500\u2500 jest.config.js \u251c\u2500\u2500 package.json \u251c\u2500\u2500 project.json \u251c\u2500\u2500 README.md \u251c\u2500\u2500 src \u2502\u00a0\u00a0 \u251c\u2500\u2500 app \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 store.spec.ts \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 store.ts \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.ts \u251c\u2500\u2500 tsconfig.app.json \u251c\u2500\u2500 tsconfig.json \u2514\u2500\u2500 tsconfig.spec.json<\/code><\/pre>\n<p>Tsconfig \u0444\u0430\u0439\u043b\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 TS. <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>tsconfig.spec.ts<\/code> &#8212; \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p><code>Project.json<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. <\/p>\n<pre><code class=\"json\">{   \"root\": \"packages\/store\",   \"sourceRoot\": \"packages\/store\/src\",   \"projectType\": \"application\",   \"targets\": {     \"build\": {       \"executor\": \"@nrwl\/js:tsc\",       \"outputs\": [\"{options.outputPath}\"],       \"options\": {         \"outputPath\": \"dist\/packages\/store\",         \"main\": \"packages\/store\/src\/index.ts\",         \"tsConfig\": \"packages\/store\/tsconfig.app.json\",         \"assets\": [\"packages\/store\/*.md\"]       }     },     \"serve\": {       \"executor\": \"@nrwl\/js:node\",       \"options\": {         \"buildTarget\": \"store:build\"       }     },     \"lint\": {       \"executor\": \"@nrwl\/linter:eslint\",       \"outputs\": [\"{options.outputFile}\"],       \"options\": {         \"lintFilePatterns\": [\"packages\/store\/**\/*.ts\"]       }     },     \"test\": {       \"executor\": \"@nrwl\/jest:jest\",       \"outputs\": [\"coverage\/packages\/store\"],       \"options\": {         \"jestConfig\": \"packages\/store\/jest.config.js\",         \"passWithNoTests\": true       }     }   },   \"tags\": [] }<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u0438\u0434\u043d\u044b \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0435\u0441\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0442\u0438\u043b\u0435\u0439 (<code>lint<\/code>) \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f (<code>test<\/code>).<\/p>\n<p>\u0421\u0430\u043c\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0444\u0430\u0439\u043b &#8212; <code>store.ts<\/code>:<\/p>\n<pre><code class=\"javascript\">export function store(): string {   return 'store'; }<\/code><\/pre>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 api:<\/p>\n<pre><code class=\"bash\">nx generate @nrwl\/js:library api<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a5\/661\/db4\/1a5661db45419a8c746960ac5e1f52f8.png\" width=\"1174\" height=\"270\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1a5\/661\/db4\/1a5661db45419a8c746960ac5e1f52f8.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<pre><code class=\"bash\">\u251c\u2500\u2500 jest.config.js \u251c\u2500\u2500 package.json \u251c\u2500\u2500 project.json \u251c\u2500\u2500 README.md \u251c\u2500\u2500 src \u2502\u00a0\u00a0 \u251c\u2500\u2500 index.ts \u2502\u00a0\u00a0 \u2514\u2500\u2500 lib \u2502\u00a0\u00a0     \u251c\u2500\u2500 api.spec.ts \u2502\u00a0\u00a0     \u2514\u2500\u2500 api.ts \u251c\u2500\u2500 tsconfig.json \u251c\u2500\u2500 tsconfig.lib.json \u2514\u2500\u2500 tsconfig.spec.json<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043d\u0435\u043c\u043d\u043e\u0433\u0438\u0445 \u043e\u0442\u043b\u0438\u0447\u0438\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043e\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f project.json:<\/p>\n<pre><code class=\"json\">{   \"root\": \"packages\/api\",   \"sourceRoot\": \"packages\/api\/src\",   \"projectType\": \"library\",   \"targets\": {     \"build\": {       \"executor\": \"@nrwl\/js:tsc\",       \"outputs\": [\"{options.outputPath}\"],       \"options\": {         \"outputPath\": \"dist\/packages\/api\",         \"main\": \"packages\/api\/src\/index.ts\",         \"tsConfig\": \"packages\/api\/tsconfig.lib.json\",         \"assets\": [\"packages\/api\/*.md\"]       }     },     \"lint\": {       \"executor\": \"@nrwl\/linter:eslint\",       \"outputs\": [\"{options.outputFile}\"],       \"options\": {         \"lintFilePatterns\": [\"packages\/api\/**\/*.ts\"]       }     },     \"test\": {       \"executor\": \"@nrwl\/jest:jest\",       \"outputs\": [\"coverage\/packages\/api\"],       \"options\": {         \"jestConfig\": \"packages\/api\/jest.config.js\",         \"passWithNoTests\": true       }     }   },   \"tags\": [] }<\/code><\/pre>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 &#8212; \u044d\u0442\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u0441 <code>serve<\/code>:<\/p>\n<pre><code class=\"json\">{   \"root\": \"packages\/store\",   \"sourceRoot\": \"packages\/store\/src\",   \"projectType\": \"application\",   \"targets\": {     ...     \"serve\": {       \"executor\": \"@nrwl\/js:node\",       \"options\": {         \"buildTarget\": \"store:build\"       }     },     ...   } }<\/code><\/pre>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <code>api<\/code> \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 <code>strore<\/code>:<\/p>\n<pre><code class=\"javascript\">import { api } from \"@boobs\/api\";  export function store(): string {   console.log(api());    return 'store'; } <\/code><\/pre>\n<p>\u0421\u043e\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"bash\">nx run store:build --with-deps<\/code><\/pre>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"bash\">nx serve store<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7f7\/6ff\/cd7\/7f76ffcd776b78eff2236201185cd528.png\" width=\"1119\" height=\"232\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7f7\/6ff\/cd7\/7f76ffcd776b78eff2236201185cd528.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u0438\u043c \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435 \u0432\u044b\u0448\u0435, \u0431\u044b\u043b \u0432\u044b\u0437\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>api<\/code>, \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f <code>store<\/code>.<\/p>\n<h2>Node \u0438 Nx<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0439\u0442\u0438 \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 NodeJs, \u0442\u043e \u0443 Nx \u0435\u0441\u0442\u044c \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 &#8212; <code>@nrwl\/node<\/code>. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 <a href=\"https:\/\/nx.dev\/node\/overview\" rel=\"noopener noreferrer nofollow\">Node \u0441 NX<\/a>.<\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u043a\u0435\u0442 \u043d\u043e\u0434\u044b \u0432 workspace:<\/p>\n<pre><code class=\"bash\">yarn add -D @nrwl\/node<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/31f\/007\/929\/31f0079292c97ebf9ff6cf64805876a5.png\" width=\"1500\" height=\"986\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/31f\/007\/929\/31f0079292c97ebf9ff6cf64805876a5.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441 node:<\/p>\n<pre><code class=\"bash\">nx g @nrwl\/node:application node-store<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/6a8\/f01\/c1a\/6a8f01c1a0fa547cbbfca68c696eaf5e.png\" width=\"1247\" height=\"270\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/6a8\/f01\/c1a\/6a8f01c1a0fa547cbbfca68c696eaf5e.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"bash\">packages\/node-store \u251c\u2500\u2500 jest.config.js \u251c\u2500\u2500 project.json \u251c\u2500\u2500 src \u2502\u00a0\u00a0 \u251c\u2500\u2500 app \u2502\u00a0\u00a0 \u251c\u2500\u2500 assets \u2502\u00a0\u00a0 \u251c\u2500\u2500 environments \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 environment.prod.ts \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 environment.ts \u2502\u00a0\u00a0 \u2514\u2500\u2500 main.ts \u251c\u2500\u2500 tsconfig.app.json \u251c\u2500\u2500 tsconfig.json \u2514\u2500\u2500 tsconfig.spec.json<\/code><\/pre>\n<p>\u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u0442\u043e\u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439.<\/p>\n<p>\u041a\u0430\u043a \u0438 \u0432\u0441\u0435 \u0434\u0440\u0443\u0433\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0444\u0430\u0439\u043b\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f project.json:<\/p>\n<pre><code class=\"json\">{   \"root\": \"packages\/node-store\",   \"sourceRoot\": \"packages\/node-store\/src\",   \"projectType\": \"application\",   \"targets\": {     \"build\": {       \"executor\": \"@nrwl\/node:build\",       \"outputs\": [\"{options.outputPath}\"],       \"options\": {         \"outputPath\": \"dist\/packages\/node-store\",         \"main\": \"packages\/node-store\/src\/main.ts\",         \"tsConfig\": \"packages\/node-store\/tsconfig.app.json\",         \"assets\": [\"packages\/node-store\/src\/assets\"]       },       \"configurations\": {         \"production\": {           \"optimization\": true,           \"extractLicenses\": true,           \"inspect\": false,           \"fileReplacements\": [             {               \"replace\": \"packages\/node-store\/src\/environments\/environment.ts\",               \"with\": \"packages\/node-store\/src\/environments\/environment.prod.ts\"             }           ]         }       }     },     \"serve\": {       \"executor\": \"@nrwl\/node:execute\",       \"options\": {         \"buildTarget\": \"node-store:build\"       }     },     \"lint\": {       \"executor\": \"@nrwl\/linter:eslint\",       \"outputs\": [\"{options.outputFile}\"],       \"options\": {         \"lintFilePatterns\": [\"packages\/node-store\/**\/*.ts\"]       }     },     \"test\": {       \"executor\": \"@nrwl\/jest:jest\",       \"outputs\": [\"coverage\/packages\/node-store\"],       \"options\": {         \"jestConfig\": \"packages\/node-store\/jest.config.js\",         \"passWithNoTests\": true       }     }   },   \"tags\": [] }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430, \u0442\u0443\u0442 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c environment&#8217;\u044b, \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0438\u0434\u044b \u0441\u0431\u043e\u0440\u043e\u043a, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a <code>development<\/code> \u0438 <code>production<\/code>.<\/p>\n<blockquote>\n<p>\u0412\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u043c\u0435\u0442\u0438\u0442, \u0447\u0442\u043e \u0447\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0435\u0442 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0442\u043e \u0432\u0441\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 Angular. <br \/>\u042d\u0442\u043e\u0442 enterprise \u0438\u0437 \u0433\u043e\u043b\u043e\u0432\u044b \u0443\u0436\u0435 \u043d\u0435 \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c.<\/p>\n<\/blockquote>\n<h2>Express \u0438 Nx<\/h2>\n<p>\u0428\u0430\u0433\u043d\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435 \u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 express. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 Nx:<\/p>\n<pre><code class=\"bash\">yarn add -D @nrwl\/express<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c99\/931\/d6e\/c99931d6e90dbbf02f70396e0140c27b.png\" width=\"964\" height=\"250\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c99\/931\/d6e\/c99931d6e90dbbf02f70396e0140c27b.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c express \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"bash\"> nx g @nrwl\/express:app express-store<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/680\/3d8\/9df\/6803d89df89b2e03a264b86905c3d8b9.png\" width=\"1276\" height=\"534\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/680\/3d8\/9df\/6803d89df89b2e03a264b86905c3d8b9.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043c\u0430\u043d\u0434, Nx \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0438 \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c express \u043e\u043d \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0432 <code>package.json<\/code>:<\/p>\n<pre><code class=\"json\">{   \"name\": \"boobs\",   \"version\": \"0.0.0\",   \"license\": \"MIT\",   \"scripts\": {     \"start\": \"nx serve store\",     \"build\": \"nx run store:build --with-deps\"   },   \"private\": true,   \"dependencies\": {     \"express\": \"4.17.2\",     \"tslib\": \"^2.0.0\"   },   \"devDependencies\": {     \"@nrwl\/cli\": \"13.8.2\",     \"@nrwl\/eslint-plugin-nx\": \"^13.8.2\",     \"@nrwl\/express\": \"^13.8.3\",     \"@nrwl\/jest\": \"13.8.2\",     \"@nrwl\/js\": \"13.8.2\",     \"@nrwl\/linter\": \"^13.8.2\",     \"@nrwl\/node\": \"^13.8.3\",     \"@nrwl\/tao\": \"13.8.2\",     \"@nrwl\/workspace\": \"13.8.2\",     \"@types\/express\": \"4.17.13\",     \"@types\/jest\": \"27.0.2\",     \"@types\/node\": \"16.11.7\",     \"@typescript-eslint\/eslint-plugin\": \"~5.10.0\",     \"@typescript-eslint\/parser\": \"~5.10.0\",     \"eslint\": \"~8.7.0\",     \"eslint-config-prettier\": \"8.1.0\",     \"jest\": \"27.2.3\",     \"prettier\": \"^2.5.1\",     \"ts-jest\": \"27.0.5\",     \"typescript\": \"~4.5.2\"   } }<\/code><\/pre>\n<p>\u041e\u0442\u0441\u044e\u0434\u0430 \u0438 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441, \u0437\u0430\u0447\u0435\u043c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 Nx, \u0435\u0441\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 <code>package.json<\/code>.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"bash\">nx serve express-store<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/7dc\/897\/80b\/7dc89780b0e86d7a9579f6ae6601d0a6.png\" width=\"1045\" height=\"263\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/7dc\/897\/80b\/7dc89780b0e86d7a9579f6ae6601d0a6.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0442\u043a\u0440\u043e\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a3d\/df2\/295\/a3ddf2295a0b78f66dfd6cf243a2bf45.png\" width=\"1255\" height=\"281\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a3d\/df2\/295\/a3ddf2295a0b78f66dfd6cf243a2bf45.png\"\/><figcaption><\/figcaption><\/figure>\n<blockquote>\n<p>\u041c\u0430\u0433\u0438\u044f, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043a\u0430\u0436\u0435\u0448\u044c.<\/p>\n<\/blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430 node \u0438 express, \u0442\u043e \u043e\u043d\u0438 \u043a\u0430\u043a \u043d\u0435 \u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435\u043c express \u0432 <code>main.ts<\/code>:<\/p>\n<pre><code>\/**  * This is not a production server yet!  * This is only a minimal backend to get started.  *\/  import * as express from 'express';  const app = express();  app.get('\/api', (req, res) => {   res.send({ message: 'Welcome to express-store!' }); });  const port = process.env.port || 3333; const server = app.listen(port, () => {   console.log(`Listening at http:\/\/localhost:${port}\/api`); }); server.on('error', console.error); <\/code><\/pre>\n<h2>Web \u0438 Nx<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u043f\u0430\u043a\u0435\u0442\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f web \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 &#8212; <code>@nrwl\/web<\/code><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u043a\u0435\u0442 \u0432 workspace:<\/p>\n<pre><code class=\"bash\">yarn add -D @nrwl\/web<\/code><\/pre>\n<p>\u041f\u0430\u043a\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043e\u043a\u043e\u043b\u043e 300 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u0435\u0431 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c web \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"bash\">nx g @nrwl\/web:app web-store<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/24e\/a28\/0d0\/24ea280d0268535c2dd2045a079a155d.png\" width=\"675\" height=\"129\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/24e\/a28\/0d0\/24ea280d0268535c2dd2045a079a155d.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u044b\u0431\u0435\u0440\u0435\u043c SCSS:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bfa\/bb4\/4d3\/bfabb44d3b1a8b31d65a4ead761be44c.png\" width=\"1072\" height=\"794\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bfa\/bb4\/4d3\/bfabb44d3b1a8b31d65a4ead761be44c.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<pre><code>nx serve web-store<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e7f\/ba7\/827\/e7fba78277f3ad3ff4ad0324215293da.png\" width=\"1405\" height=\"410\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e7f\/ba7\/827\/e7fba78277f3ad3ff4ad0324215293da.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0442\u043a\u0440\u043e\u0435\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440 &#8212; http:\/\/localhost:4200<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9e0\/302\/deb\/9e0302debcac631aff648295c384af9f.png\" width=\"1097\" height=\"1078\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9e0\/302\/deb\/9e0302debcac631aff648295c384af9f.png\"\/><figcaption><\/figcaption><\/figure>\n<blockquote>\n<p>\u0412\u044b\u0448\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u043c \u043c\u043e\u0435\u0433\u043e \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c \u043d\u0430 \u043f\u043e\u043c\u043e\u0439\u043a\u0443.<\/p>\n<\/blockquote>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0438\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0443\u0436\u0435 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Angular \u0438 React.<\/p>\n<p>\u0422\u0430\u043c \u0432\u0441\u0435 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e. \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u043f\u0430\u043a\u0435\u0442, \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. <\/p>\n<pre><code class=\"bash\">yarn add -D @nrwl\/angular nx g @nrwl\/angular:app angular-store<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e, \u0441\u0442\u043e\u0438\u0442 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 workspace \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0441\u0435\u0442\u044b \u0441 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<h2>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/h2>\n<p>\u0412\u0441\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 &#8212; <a href=\"https:\/\/github.com\/Fafnur\/boobs\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/Fafnur\/boobs<\/a>:<\/p>\n<div class=\"embed_link\">\n<div class=\"embed__thumb\" style=\"background-image: url(&quot;https:\/\/opengraph.githubassets.com\/cfd108a3c640b12be113381cf01854ea553f3b0f6c30b2b248c6ca6cc1cbc5cd\/Fafnur\/boobs&quot;);\"><\/div>\n<div class=\"embed__caption\">\n<div class=\"embed__caption-title\"><span>GitHub &#8212; Fafnur\/boobs: NX samples<\/span><\/div>\n<p><a href=\"https:\/\/github.com\/Fafnur\/boobs\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"embed__caption-link\">github.com<\/a><\/div>\n<\/div>\n<h2>\u0420\u0435\u0437\u044e\u043c\u0435<\/h2>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b \u043e \u0442\u0430\u043a\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u043a\u0430\u043a Nx \u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u0421\u0434\u0435\u043b\u0430\u043b \u043a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Nx, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u043b \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. <\/p>\n<p>\u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0434\u043b\u044f \u0432\u0435\u0431 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442\u0441\u044f. \u0413\u0440\u0443\u0441\u0442\u043d\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 gulp \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0431\u043e\u0440\u043a\u0438. \u041d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0440\u0435\u0442\u0435\u043d\u0437\u0438\u0439 \u043a gulp, grunt \u0438 webpack, \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0435\u0448\u0430\u043b\u0438 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0438 &#8212; \u0431\u044b\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u044b \u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u0418 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439. \u0425\u043e\u0440\u043e\u0448\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f Nx, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043e\u0437\u044c\u043c\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u0432\u0435\u0441\u044c front-ops \u0438 \u0434\u0430\u0441\u0442 \u0432\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0442\u0435\u043c, \u0447\u0435\u043c \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a &#8212; \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0430 \u043d\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u0432, \u0438 \u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 vendors. <\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/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\/post\/652453\/\"> https:\/\/habr.com\/ru\/post\/652453\/<\/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_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 Nx \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 Typescript.<\/p>\n<p>\u0414\u0432\u0430 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434 \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0430 \u043c\u0435\u0434\u0438\u0443\u043c\u0435 &#8212; <a href=\"https:\/\/medium.com\/fafnur\/%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0-typescript-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-webpack-8cd04eba6a8f\" rel=\"noopener noreferrer nofollow\">\u0421\u0431\u043e\u0440\u043a\u0430 Typescript \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Webpack<\/a>, \u0433\u0434\u0435 \u043f\u043e\u0434\u0435\u043b\u0438\u043b\u0441\u044f \u0441\u0432\u043e\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Typescript \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <a href=\"https:\/\/webpack.js.org\/\" rel=\"noopener noreferrer nofollow\">Webpack<\/a>.\u00a0<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0418 \u0432\u0441\u0435 \u0431\u044b \u043d\u0438\u0447\u0435\u0433\u043e, \u0435\u0441\u043b\u0438 \u0431\u044b \u044d\u0442\u043e \u043d\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u043e. \u0412\u0441\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0438 \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440, \u043d\u043e \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u043e\u0431 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438 \u043f\u043e\u0439\u0434\u0435\u0442 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0439 \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440.<\/p>\n<h2>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/h2>\n<p>\u0411\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0435\u0445 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0432 \u043e\u0434\u0438\u043d \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0444\u0438\u043d. \u0442\u0435\u0445 \u0441\u0442\u0430\u0440\u0442\u0430\u043f Angular \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c. \u0418 \u043f\u043e \u043c\u0435\u0440\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447, \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e\u0441\u0442\u044c \u0432 \u043d\u0435\u043a\u043e\u0435\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u043b\u043e \u0431\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c:<\/p>\n<ul>\n<li>\n<p>\u042f\u0437\u044b\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 Typescript;<\/p>\n<\/li>\n<li>\n<p>Livereload \u043f\u0440\u0438 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u0442\u044c &#171;prod&#187; \u0441\u0431\u043e\u0440\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434.\u00a0<\/p>\n<\/li>\n<\/ul>\n<blockquote>\n<p>\u041e\u0434\u043d\u0438\u043c \u0441\u043b\u043e\u0432\u043e\u043c \u0432\u0441\u0435 \u0442\u043e, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 JS \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430\u0445.\u00a0<\/p>\n<\/blockquote>\n<p>\u042f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 github\u2019\u0435, \u043d\u043e \u043d\u0438 \u043e\u0434\u043d\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u0434\u043e\u0448\u043b\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u043b\u0438\u0431\u043e \u043e\u043d\u0438 \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u043b\u0438\u0441\u044c, \u043b\u0438\u0431\u043e \u0431\u044b\u043b\u0438 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u044b. \u041c\u043d\u0435 \u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0447\u0442\u043e-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0435.\u00a0<\/p>\n<p>\u042f \u0431\u044b\u043b \u0437\u043d\u0430\u043a\u043e\u043c \u0441 webpack \u0438 \u043c\u043d\u0435 \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u043e \u0442\u0440\u0443\u0434\u0430 \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043e\u0434\u0443\u043b\u0435\u0439 \u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u043b\u0430 \u0432\u044b\u0448\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u043c \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c.\u00a0<\/p>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e, \u0437\u0430 \u043e\u0434\u043d\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c, \u0447\u0442\u043e \u0435\u0433\u043e \u0442\u0440\u0443\u0434\u043d\u043e \u0431\u044b\u043b\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c. \u0418\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u044d\u0442\u043e \u0431\u044b\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u043b\u0441\u044f, \u0442\u043e \u044f\u0432\u043d\u043e\u0433\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c 5 &#8212; 10 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0435 \u0431\u044b\u043b\u043e. <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0436\u0438\u043b\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043c\u0438\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043a\u043e\u043f\u0438\u0440\u0443\u044f \u043a\u0443\u0441\u043a\u0438 \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0435. \u0412 \u043e\u0434\u0438\u043d \u043c\u043e\u043c\u0435\u043d\u0442 \u044f \u0434\u0430\u0436\u0435 \u043f\u043e\u0434\u0443\u043c\u044b\u0432\u0430\u043b \u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0432\u043e\u0435\u0433\u043e CLI, \u043d\u043e \u0441\u0430\u043c\u0430 \u043c\u044b\u0441\u043b\u044c \u043e\u0431 \u044d\u0442\u043e\u043c \u044f\u0432\u043d\u043e \u043a\u0440\u0438\u0447\u0430\u043b\u0430 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u044f \u0434\u0435\u043b\u0430\u044e \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a.\u00a0<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 \u0442\u043e\u0436\u0435 \u0432\u0440\u0435\u043c\u044f, \u044f \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Nx \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 Angular \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<\/p>\n<h2>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e Nx<\/h2>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>Nx \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0443\u0442\u0438\u043b\u0438\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c.\u00a0\u0421 Nx \u043c\u043e\u0436\u043d\u043e \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0432 <a href=\"https:\/\/nx.dev\/getting-started\/intro.\" rel=\"noopener noreferrer nofollow\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 typescript \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u0434\u0435\u043b &#8212;\u00a0<a href=\"https:\/\/nx.dev\/getting-started\/nx-and-typescript\" rel=\"noopener noreferrer nofollow\">Nx \u0438 TypeScript<\/a>.<\/p>\n<blockquote>\n<p>\u0412 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f, \u0447\u0430\u0441\u0442\u044c Angular Team \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u0432\u043e\u044e \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044e <a href=\"https:\/\/nrwl.io\/\" rel=\"noopener noreferrer nofollow\">Nrwl<\/a>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439  \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 <a href=\"https:\/\/angular.io\/\" rel=\"noopener noreferrer nofollow\">Angular<\/a>. \u041a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u0438 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0439 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 Fortune 500 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u0438 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e Angular, \u0430 \u0442\u0430\u043a\u0436\u0435 React, Vue \u0438 \u0447\u0438\u0441\u0442\u044b\u0439 Typescript.<\/p>\n<\/blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0438\u0442\u0430\u0435\u0442\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c, \u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430 Nx \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0432\u044b\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0440\u043e\u043b\u0438\u043a\u0438 \u0441 \u043e\u0431\u0437\u043e\u0440\u043e\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f.\u00a0\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u043e\u043b\u0438\u043a \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0439 \u043f\u0435\u0440\u0432\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f:<\/p>\n<div class=\"tm-iframe_temp\" data-src=\"https:\/\/embedd.srv.habr.com\/iframe\/620f38a1e635030b64de7fe9\" data-style=\"\" id=\"620f38a1e635030b64de7fe9\" width=\"\"><\/div>\n<p>\u0412\u043e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 Nx:<\/p>\n<ul>\n<li>\n<p>\u0432\u0441\u044f \u043c\u043e\u0449\u044c typescript \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 eslint;<\/p>\n<\/li>\n<li>\n<p>\u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0441 \u0435\u0434\u0438\u043d\u043e\u0439 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u043e\u0439;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b &#8212; \u0441\u0435\u043c\u0435\u0439\u0441\u0442\u0432\u043e \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0434\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0441 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0438 \u043a\u043e\u043c\u0430\u043d\u0434;<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0435\u0440\u0441\u0438\u0438 \u0434\u043b\u044f \u0440\u0435\u043b\u0438\u0437\u0430 \u0441 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 &#8212; \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, Nx \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u0440\u0430\u0432\u0438\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043a \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u043e\u043c\u0443 \u0432\u0438\u0434\u0443;<\/p>\n<\/li>\n<li>\n<p>\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 React, Angular, Vue \u0438 Svetle.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e Nx.<\/p>\n<blockquote>\n<p>\u0414\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, NX &#8212; \u043d\u0430\u0431\u043e\u0440 \u0443\u0442\u0438\u043b\u0438\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0437\u0430 \u0432\u0430\u0441, \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u043e, \u043d\u043e \u0432 \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0445 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445, \u043a\u043e\u043d\u0435\u0447\u043d\u043e.<\/p>\n<\/blockquote>\n<h2>\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/h2>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 nx \u0432\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u0430\u044f NodeJS \u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a <code>npm<\/code> \u0438\u043b\u0438 <code>yarn<\/code>.<\/p>\n<blockquote>\n<p><em>\u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 NodeJS \u043c\u043e\u0436\u043d\u043e \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 &#8212; <\/em><a href=\"https:\/\/nodejs.org\/en\/docs\/\" rel=\"noopener noreferrer nofollow\"><em><u>https:\/\/nodejs.org\/en\/docs<\/u><\/em><\/a><em><u>.<\/u><\/em><\/p>\n<\/blockquote>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c nx, \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c nx cli \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"bash\">yarn global add \/cli<\/code><\/pre>\n<p>\u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b nx \u0431\u0435\u0437 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u043e\u0432 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 (yarn \u0438\u043b\u0438 npm):<\/p>\n<pre><code class=\"bash\">nx g lib mylib<\/code><\/pre>\n<p>\u0418\u043d\u0430\u0447\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0438\u0441\u0430\u0442\u044c:<\/p>\n<pre><code class=\"bash\">yarn nx g lib mylib<\/code><\/pre>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 workspace \u0434\u043b\u044f typescript \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h2>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 Nx workspace \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">npx create-nx-workspace@latest<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 <code>yarn<\/code>, \u0442\u043e \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code class=\"bash\">yarn create nx-workspace --package-manager=yarn\u00a0<\/code><\/pre>\n<figure class=\"full-width\"><figcaption>\u0417\u0430\u043f\u0443\u0441\u043a \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f Nx workspace<\/figcaption><\/figure>\n<p>\u0412\u0432\u0435\u0434\u0435\u043c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 workspace &#8212; <code>boobs<\/code>:<\/p>\n<figure class=\"full-width\"><figcaption>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 boobs Nx workspace<\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 workspace \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u0438\u043f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 (<code>angular<\/code>, <code>react<\/code>, <code>node<\/code> \u0438\u043b\u0438 <code>typescript<\/code>). \u0414\u0430\u043d\u043d\u0430\u044f \u043e\u043f\u0446\u0438\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u0430\u043a\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0443\u0434\u0443\u0442 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b \u0432 <code>package.json.<\/code><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0435\u043c <code>ts<\/code>:<\/p>\n<figure class=\"full-width\"><figcaption>\u0412\u044b\u0431\u043e\u0440 \u0442\u0438\u043f\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 Nx<\/figcaption><\/figure>\n<p>\u041e\u0442\u043a\u0430\u0436\u0435\u043c\u0441\u044f \u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u043a\u0430:<\/p>\n<figure class=\"full-width\"><figcaption>\u041e\u043f\u0446\u0438\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f Nx Cloud<\/figcaption><\/figure>\n<blockquote>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435 \u0431\u043e\u0438\u0442\u0435\u0441\u044c \u0441\u0442\u0430\u0442\u044c <a href=\"https:\/\/adventuretime.fandom.com\/ru\/wiki\/%D0%9F%D1%83%D0%BF%D1%8B%D1%80%D1%87%D0%B0%D1%82%D1%8B%D0%B5_%D0%BB%D1%8E%D0%B4%D0%B8\" rel=\"noopener noreferrer nofollow\">\u043f\u0443\u043f\u044b\u0440\u043a\u043e\u0439<\/a>, \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u043b\u0430\u043a\u043e.<\/p>\n<\/blockquote>\n<p>\u0414\u0430\u043b\u0435\u0435 Nx \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>Nx \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0433\u0434\u0435 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0438\u043b \u043f\u0440\u043e\u0439\u0442\u0438 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \ud83d\ude42<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c:<\/p>\n<pre><code class=\"bash\">cd boobs<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043b Nx, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>ls<\/code>:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043e\u0442\u043a\u0440\u043e\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043b\u044e\u0431\u0438\u043c\u043e\u0439 <a href=\"https:\/\/www.jetbrains.com\/webstorm\/\" rel=\"noopener noreferrer nofollow\">IDE<\/a>:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<blockquote>\n<p><a href=\"https:\/\/www.jetbrains.com\/\" rel=\"noopener noreferrer nofollow\">JetBrains<\/a>, \u043a \u043c\u043e\u0435\u043c\u0443 \u0431\u043e\u043b\u044c\u0448\u043e\u043c\u0443 \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043d\u0435 \u0445\u043e\u0447\u0435\u0442 <s>\u043f\u043e\u0434\u043e\u0433\u043d\u0430\u0442\u044c<\/s> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043c\u043d\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e. \u0412\u0438\u0434\u0438\u043c\u043e \u0441\u043a\u043e\u0440\u043e \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 <a href=\"https:\/\/code.visualstudio.com\/\" rel=\"noopener noreferrer nofollow\">VSCode<\/a>.<\/p>\n<\/blockquote>\n<p>\u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e Nx \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:<\/p>\n<pre><code>boobs\/ \u251c\u2500\u2500 packages\/ \u251c\u2500\u2500 tools\/ \u251c\u2500\u2500 workspace.json \u251c\u2500\u2500 nx.json \u251c\u2500\u2500 package.json \u2514\u2500\u2500 tsconfig.base.json<\/code><\/pre>\n<p>\u041e\u0442\u043a\u0440\u043e\u0435\u043c <code>package.json<\/code>:<\/p>\n<pre><code class=\"json\">{   \"name\": \"boobs\",   \"version\": \"0.0.0\",   \"license\": \"MIT\",   \"scripts\": {},   \"private\": true,   \"dependencies\": {},   \"devDependencies\": {     \"@nrwl\/cli\": \"13.8.2\",     \"@nrwl\/js\": \"13.8.2\",     \"@nrwl\/tao\": \"13.8.2\",     \"@nrwl\/workspace\": \"13.8.2\",     \"@types\/node\": \"16.11.7\",     \"prettier\": \"^2.5.1\",     \"typescript\": \"~4.5.2\"   } }<\/code><\/pre>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f, Nx \u0441\u043e\u0437\u0434\u0430\u043b \u043d\u043e\u0432\u044b\u0439, \u043f\u0443\u0441\u0442\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0441 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u043e\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041f\u0430\u043a\u0435\u0442\u044b <code>@nrwl<\/code> \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f, \u0433\u0434\u0435 \u043b\u0438\u0431\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u044e\u0442 <code>cli<\/code>, \u043b\u0438\u0431\u043e <code>js<\/code>, \u043b\u0438\u0431\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u044e\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441\u0430\u043c\u043e\u0433\u043e <code>workspace<\/code>.<\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0444\u0430\u0439\u043b <code>nx.json<\/code>:<\/p>\n<pre><code class=\"json\">{   \"extends\": \"@nrwl\/workspace\/presets\/core.json\",   \"npmScope\": \"boobs\",   \"affected\": {     \"defaultBase\": \"main\"   },   \"cli\": {     \"defaultCollection\": \"@nrwl\/workspace\"   },   \"tasksRunnerOptions\": {     \"default\": {       \"runner\": \"@nrwl\/workspace\/tasks-runners\/default\",       \"options\": {         \"cacheableOperations\": [           \"build\",           \"lint\",           \"test\",           \"e2e\"         ]       }     }   } }<\/code><\/pre>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u043c\u0435\u0435\u043c 3 \u0441\u0435\u043a\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><code>affected<\/code> &#8212; \u0432\u0435\u0442\u043a\u0430, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u042d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u0442\u0435\u0441\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c, \u0438 \u043a\u0430\u043a\u0438\u0435 \u0447\u0430\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430  (\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438) \u0431\u044b\u043b\u0438 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 \u043f\u0440\u0430\u0432\u043e\u043a.<\/p>\n<\/li>\n<li>\n<p><code>cli<\/code> &#8212; \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 CLI. \u041e\u0431\u044b\u0447\u043d\u043e, \u0442\u0430\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438 nx. \u0415\u0441\u043b\u0438 \u0432\u044b \u0444\u0430\u043d\u0430\u0442\u0438\u043a yarn, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <code>\"packageManager\": \"yarn\"<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435\u0433\u0434\u0430 <code>yarn<\/code> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p><code>tasksRunnerOptions<\/code> &#8212; \u043d\u0430\u0431\u043e\u0440 \u043f\u0440\u0430\u0432\u0438\u043b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a. \u0414\u043b\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.<\/p>\n<\/li>\n<\/ul>\n<p>\u0424\u0430\u0439\u043b <code>workspace.json<\/code> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043f\u0443\u0442\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 \u0434\u043b\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"json\">{   \"version\": 2,   \"projects\": {} }<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0444\u0430\u0439\u043b \u044d\u0442\u043e <code>tsconfig.base.json<\/code>:<\/p>\n<pre><code class=\"json\">{   \"compileOnSave\": false,   \"compilerOptions\": {     \"rootDir\": \".\",     \"sourceMap\": true,     \"declaration\": false,     \"moduleResolution\": \"node\",     \"emitDecoratorMetadata\": true,     \"experimentalDecorators\": true,     \"importHelpers\": true,     \"target\": \"es2015\",     \"module\": \"esnext\",     \"lib\": [\"es2017\", \"dom\"],     \"skipLibCheck\": true,     \"skipDefaultLibCheck\": true,     \"baseUrl\": \".\",     \"paths\": {}   },   \"exclude\": [\"node_modules\", \"tmp\"] }<\/code><\/pre>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e. \u041c\u043e\u0436\u043d\u043e \u0431\u0430\u043c\u043f\u043d\u0443\u0442\u044c es \u0434\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u0431\u0440\u043e\u0441\u0430\u0435\u0442\u0441\u044f \u0432 \u0433\u043b\u0430\u0437\u0430 &#8212; \u044d\u0442\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 <code>eslint<\/code>. <\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c <code>eslint<\/code> \u0432 workspace:<\/p>\n<pre><code class=\"bash\">yarn add --dev @nrwl\/linter yarn add --dev @nrwl\/eslint-plugin-nx<\/code><\/pre>\n<blockquote>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0448\u0430\u0433 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, Nx \u0441\u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u0441\u0435 \u0437\u0430 \u0432\u0430\u0441, \u0438 \u0441\u0430\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442 eslint \u0438 jest.<\/p>\n<\/blockquote>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 NX workspace<\/h2>\n<p>\u0412 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432:<\/p>\n<ul>\n<li>\n<p>\u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 &#8212; \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 npmjs<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f &#8212; \u0442\u043e\u0436\u0435 \u0447\u0442\u043e \u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u043c\u0435\u0435\u0442 \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 &#8212; store:<\/p>\n<pre><code>nx generate @nrwl\/js:app store<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u043e\u0432:<\/p>\n<ul>\n<li>\n<p><code>.eslintrc.json<\/code> &#8212; \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u0438\u043d\u0442\u0435\u0440\u0430<\/p>\n<\/li>\n<li>\n<p><code>jest.config.js<\/code>, <code>jest.preset.js<\/code> &#8212; \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0434\u043b\u044f unit \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e jest<\/p>\n<\/li>\n<\/ul>\n<p>Workspace.json \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"json\">{   \"version\": 2,   \"projects\": {     \"store\": \"packages\/store\"   } } <\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435, \u0438\u0437-\u0437\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e jest, Nx \u043b\u044e\u0431\u0435\u0437\u043d\u043e \u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b, \u043e\u0431\u043d\u043e\u0432\u0438\u0432 <code>package.json<\/code>:<\/p>\n<pre><code class=\"json\">{   \"name\": \"boobs\",   \"version\": \"0.0.0\",   \"license\": \"MIT\",   \"scripts\": {},   \"private\": true,   \"dependencies\": {     \"tslib\": \"^2.0.0\"   },   \"devDependencies\": {     \"@nrwl\/cli\": \"13.8.2\",     \"@nrwl\/eslint-plugin-nx\": \"^13.8.2\",     \"@nrwl\/jest\": \"13.8.2\",     \"@nrwl\/js\": \"13.8.2\",     \"@nrwl\/linter\": \"^13.8.2\",     \"@nrwl\/tao\": \"13.8.2\",     \"@nrwl\/workspace\": \"13.8.2\",     \"@types\/jest\": \"27.0.2\",     \"@types\/node\": \"16.11.7\",     \"@typescript-eslint\/eslint-plugin\": \"~5.10.0\",     \"@typescript-eslint\/parser\": \"~5.10.0\",     \"eslint\": \"~8.7.0\",     \"eslint-config-prettier\": \"8.1.0\",     \"jest\": \"27.2.3\",     \"prettier\": \"^2.5.1\",     \"ts-jest\": \"27.0.5\",     \"typescript\": \"~4.5.2\"   } } <\/code><\/pre>\n<blockquote>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0435\u043b\u044c\u0437\u044f \u0431\u044b\u043b\u043e \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 package.json, \u043d\u0443 \u0434\u0430 \u043b\u0430\u0434\u043d\u043e.<\/p>\n<\/blockquote>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442:<\/p>\n<pre><code class=\"json\">nx serve store<\/code><\/pre>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e livereload \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u0415\u0441\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0432 \u043c\u043e\u043d\u043e\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u0442\u043e \u0442\u0430\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430:<\/p>\n<pre><code class=\"bash\">packages\/store \u251c\u2500\u2500 jest.config.js \u251c\u2500\u2500 package.json \u251c\u2500\u2500 project.json \u251c\u2500\u2500 README.md \u251c\u2500\u2500 src \u2502\u00a0\u00a0 \u251c\u2500\u2500 app \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 store.spec.ts \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 store.ts \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.ts \u251c\u2500\u2500 tsconfig.app.json \u251c\u2500\u2500 tsconfig.json \u2514\u2500\u2500 tsconfig.spec.json<\/code><\/pre>\n<p>Tsconfig \u0444\u0430\u0439\u043b\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 TS. <\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>tsconfig.spec.ts<\/code> &#8212; \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p><code>Project.json<\/code> \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. <\/p>\n<pre><code class=\"json\">{   \"root\": \"packages\/store\",   \"sourceRoot\": \"packages\/store\/src\",   \"projectType\": \"application\",   \"targets\": {     \"build\": {       \"executor\": \"@nrwl\/js:tsc\",       \"outputs\": [\"{options.outputPath}\"],       \"options\": {         \"outputPath\": \"dist\/packages\/store\",         \"main\": \"packages\/store\/src\/index.ts\",         \"tsConfig\": \"packages\/store\/tsconfig.app.json\",         \"assets\":<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-329850","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/329850","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=329850"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/329850\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=329850"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=329850"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=329850"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}