Нужен совет по установке npm на SSD диск - PullRequest
0 голосов
/ 04 марта 2019

Проблема в следующем: я делаю 4-5 небольших веб-сайтов в неделю и использую инструменты (webpack, ejs и т. Д.).Поэтому на каждом сайте, над которым я работал, я делал npm install локально.Все было в порядке с моей старой машиной с жестким диском, но теперь я получил новый ноутбук только с твердотельным накопителем (и у меня нет шансов вернуться на жесткий диск).Дело в том, что я боюсь убивать мой SSD-накопитель слишком быстро, делая npm install 4 раза в неделю.Есть ли разумный способ оптимизировать это?Может быть, я могу установить devDependencies глобально или установить его где-то один раз и связать с ними, и установить локально только prod dependencies?

Вот мои средние значения package.json deps:

"dependencies": {
  "siema": "^1.5.1"
},
"devDependencies": {
  "autoprefixer": "^9.1.5",
  "copy-webpack-plugin": "^4.5.2",
  "ejs-compiled-loader": "^1.1.0",
  "group-css-media-queries-loader": "^2.0.2",
  "postcss-loader": "^3.0.0",
  "babel-core": "6.26.3",
  "babel-loader": "7.1.5",
  "babel-polyfill": "^6.0.16",
  "babel-preset-env": "1.7.0",
  "babel-preset-stage-0": "^6.0.15",
  "clean-webpack-plugin": "0.1.19",
  "cross-env": "5.2.0",
  "css-loader": "1.0.0",
  "file-loader": "1.1.11",
  "html-webpack-plugin": "3.2.0",
  "jimp": "^0.6.0",
  "mini-css-extract-plugin": "^0.4.3",
  "node-sass": "4.9.2",
  "optimize-css-assets-webpack-plugin": "^5.0.1",
  "puppeteer": "^1.11.0",
  "raw-loader": "^1.0.0",
  "sass-loader": "7.0.3",
  "style-loader": "0.21.0",
  "uglifyjs-webpack-plugin": "^2.0.1",
  "url-loader": "1.0.1",
  "webpack": "4.16.3",
  "webpack-cli": "3.1.0",
  "webpack-dev-server": "^3.1.10",
  "webpack-merge": "4.1.3"
}

Заранее спасибо.

ОБНОВЛЕНИЕ: Вероятно, решено.

Обращаясь к этой теме , я установил свои devdeps в отдельной папке closeroot, и в проекте package.json я связал devdeps следующим образом:

"devDependencies": {
  "autoprefixer": "file:c:/_npmg/node_modules/autoprefixer",
  "copy-webpack-plugin": "file:c:/_npmg/node_modules/copy-webpack-plugin",
  "ejs-compiled-loader": "file:c:/_npmg/node_modules/ejs-compiled-loader",
  /* ... */
}

Результаты выглядят так:

node_modules: size and structure

... и все работает просто отлично.

Теперь мне интересно, является ли это наиболее подходящим решением для моего случая (учитывая, что это требуется только для локального разработчика, я не использую docker или что-то в этом роде)или есть более оптимальный способ.

1 Ответ

0 голосов
/ 05 марта 2019

Обновление:

Мое оригинальное решение, приведенное ниже, является хакерским и имеет некоторые недостатки.С другой стороны, pnpm , как подсказывает @sachin Gupta, кажется простым решением вашей проблемы .Я еще не пробовал, но если документация не лжет, это действительно так просто, как , следуя инструкции по установке , а затем просто используйте команду $ pnpm вместо $ npm для установки зависимостей вашего проекта.

Хранение общих зависимостей в корневой папке

Чтобы решить вашу проблему, нужно, чтобы все папки вашего проекта были вложенными папками другой -летки, называя ее root -, что, в свою очередь,также имеет package.json и node_modules.Этот root проект имеет все общие зависимости dev, которые разделяют ваши проекты: webpack, babel, node-sass и т. Д.

Пример структуры папки

. root/
+-- node_modules/
+-- package.json
|   +-- web-project-1/
|     +-- package.json
|     +-- src/
|       +-- main.js
|       +-- index.html
|     +-- dist/
|       +-- index.html
|   +-- web-project-1/
|     +-- package.json
|     +-- src/
|       +-- main.js
|       +-- index.html
|     +-- dist/
|       +-- index.html

Это только пример.Единственная важная часть заключается в том, что зависимости dev находятся в папке node_modules родительского ваших проектов.

Хорошие части

  1. Любые import или require в дочерних папках будут использовать узлы root.Таким образом, код вашего приложения будет использовать родительский node_modules без необходимости дальнейшей настройки.Это поведение по умолчанию для node.js, когда вы выполняете require в любом дереве папок: если он не находит node_modules в рабочем каталоге, он всегда ищет node_modules в родительских каталогах до корневой папки.

  2. Любой скрипт npm в дочерних элементах, использующих двоичные файлы node_modules, также будет их использовать.Это аккуратно.Поэтому, если в какой-либо из дочерних папок у вас есть проект с webpack в качестве сценария npm, определенного в package.json, вы можете вызвать его из командной строки: npm run webpack без необходимости устанавливать node_modules в дочернем элементе.папка.

Так, в примере, если root 'node_modules имеет зависимость tslint, вы можете настроить web-project-1/package.json сценарии, такие как:

"scripts": {
  "lint": "tslint --project . --fix"
},

И когда вы запускаете npm run lint в терминале, для выполнения этой команды будут использоваться двоичные файлы root node_modules.

То же самое происходит для всех остальных разработчиковзависимость, как webpack, gulp, node-sass или тому подобное.

Плохие части

Плохая часть в том, что если вы npm install любой из детей из ихpackage.json, зависимости, перечисленные в этом package.json, будут установлены и у детей, даже если они уже присутствуют у родителя.Это делает этот подход довольно неприятным, если вы хотите объявить детские dev-зависимости в их package.json: вам следует вручную удалять дублирующиеся deps у детей каждый раз, когда вы выполняете npm install.

Однако, так каквы поставляете только папку dist, вам не нужно перечислять зависимости dev каждого проекта в его package.json.Если вам когда-нибудь понадобится работать с другим разработчиком, вы можете передать им root package-json, чтобы они получили правильные зависимости dev.

Преимущество этого подхода перед вашим заключается в том, что вам не нужно вручную устанавливать символические ссылки в каждом package-json нового проекта.

Ключевые моменты

  • Родитель должен иметь все зависимости dev для проектов.
  • Невозможно перечислить зависимости dev для дочерних элементов package.json, если вы не хотите вручную удалять их из node_modules послекаждый npm install, что, как мне кажется, слишком хлопотно.
  • Если вам когда-либо понадобится другая версия зависимости в одном конкретном проекте, вы на самом деле можете перечислить ее в package.json: он будет установлен в детской node_modules.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...