Почему пакеты находятся в моем yarn.lock, а не в package.json?

Я начал этот проект с приложения create-реагировать, а затем выбросил его. В настоящее время я анализирую свой пакет веб-пакетов и получаю это.

введите здесь описание изображения

Я запустил эту команду, чтобы проанализировать свой пакет:

source-map-explorer main.<hash>.js main.<hash>.js.map

У меня есть пара вопросов -

  1. Я использую moment.js в своем приложении, однако, если посмотреть на мой package.json, его там нет. Он существует в моем yarn.lock. Почему это происходит? Почему мое приложение вообще работает?

  2. Я использую lodash, но я позаботился об импорте определенных функций lodash (например, import map from "lodash/map"). Однако я вижу lodash в своем node_module.. несмотря на то, что никогда не импортировал его. Почему это работает? Это потому, что моя зависимость зависит от всего пакета lodash, и мне просто повезло?

  3. Как заставить source-map-explorer анализировать мою производственную сборку? Я пробовал шаги в документации CRA, но они ошибались.

Почему происходит вышеописанное?

Для полного ознакомления вот мои зависимости package.json/devDependencies.

{
  "dependencies": {
    "autoprefixer": "7.1.6",
    "babel-core": "6.26.0",
    "babel-eslint": "7.2.3",
    "babel-jest": "20.0.3",
    "babel-loader": "7.1.2",
    "babel-polyfill": "^6.26.0",
    "babel-preset-react-app": "^3.1.0",
    "babel-runtime": "6.26.0",
    "case-sensitive-paths-webpack-plugin": "2.1.1",
    "chalk": "1.1.3",
    "cross-env": "5.1.4",
    "css-loader": "0.28.7",
    "dotenv": "4.0.0",
    "eslint": "4.10.0",
    "eslint-config-react-app": "^2.0.1",
    "eslint-loader": "1.9.0",
    "eslint-plugin-flowtype": "2.39.1",
    "eslint-plugin-import": "2.8.0",
    "eslint-plugin-jsx-a11y": "5.1.1",
    "eslint-plugin-react": "7.4.0",
    "extract-text-webpack-plugin": "3.0.2",
    "file-loader": "1.1.5",
    "fs-extra": "3.0.1",
    "html-webpack-plugin": "2.29.0",
    "jest": "20.0.4",
    "object-assign": "4.1.1",
    "postcss-flexbugs-fixes": "3.2.0",
    "postcss-loader": "2.0.8",
    "promise": "8.0.1",
    "query-string": "^5.1.0",
    "raf": "3.4.0",
    "react": "^16.2.0",
    "react-collapse": "^4.0.3",
    "react-countdown-now": "^1.3.0",
    "react-dev-utils": "^4.2.1",
    "react-dom": "^16.2.0",
    "react-grecaptcha": "^1.2.5",
    "react-md-spinner": "^0.2.5",
    "react-motion": "^0.5.2",
    "react-player": "^1.1.1",
    "react-redux": "^5.0.6",
    "react-responsive": "^4.0.3",
    "react-router-dom": "^4.2.2",
    "react-router-hash-link": "^1.2.0",
    "react-select": "^1.2.1",
    "redux": "^3.7.2",
    "redux-thunk": "^2.2.0",
    "style-loader": "0.19.0",
    "sw-precache-webpack-plugin": "0.11.4",
    "url-loader": "0.6.2",
    "webpack": "3.8.1",
    "webpack-dev-server": "2.9.4",
    "webpack-manifest-plugin": "1.3.2",
    "whatwg-fetch": "2.0.3",
    "xelpmoc-core": "^0.3.1"
  },
  "devDependencies": {
    "compression-webpack-plugin": "^1.1.3",
    "enzyme": "^3.3.0",
    "enzyme-adapter-react-16": "^1.1.1",
    "eslint": "^4.14.0",
    "eslint-config-recommended": "^2.0.0",
    "eslint-plugin-react": "^7.5.1",
    "google-map-react": "^0.34.0",
    "husky": "^0.14.3",
    "lint-staged": "^6.0.0",
    "pm2": "^2.9.1",
    "prettier": "^1.9.2",
    "redux-mock-store": "^1.4.0"
  },
}

person praks5432    schedule 09.04.2018    source источник


Ответы (1)


yarn.lock — это «файл блокировки», который блокирует ваше дерево зависимостей, так что когда другой товарищ по команде (или сервер CI) запускает сборку, он получает те же зависимости (и, следовательно, ту же сборку). В файле блокировки перечислены не только зависимости, но и зависимости от зависимостей.

NPM/пряжа сглаживает зависимости в node_modules, когда это возможно, поэтому у вас, вероятно, есть некоторые зависимости, которые устанавливают lodash/moment. Вы можете отладить это, запустив npm ls lodash, чтобы увидеть, откуда это происходит. Вы обязательно должны установить те пакеты, которые вы используете, но получили "случайно".

не могу ответить №3

person Ryan Silva    schedule 10.04.2018
comment
Я пытаюсь уменьшить размер пакета. Когда я запускаю npm ls lodash, я понимаю, что ничто не зависит от lodash. Тем не менее, у меня все еще есть lodash в моем комплекте. Проверяя yarn.lock, похоже, что он исходит из нескольких мест, таких как избыточность ... но означает ли это, что я вынужден иметь всю библиотеку lodash, если я использую избыточность? - person praks5432; 10.04.2018
comment
Я не очень хорошо знаком с source-map-explorer, но в любом случае вы не должны получать в своем комплекте как lodash.js, так и lodash.min.js. Думаю, будет ли Redux использовать весь lodash, зависит от того, как redux импортирует lodash. Я не уверен, что использует пакет create-реагировать-приложение, но я хотел бы посмотреть, есть ли способ отладить, как он создает пакет. Я знаю, например, что в browserify есть способ увидеть цепочку импорта, которой он следует при создании пакета. - person Ryan Silva; 10.04.2018
comment
Я понял, какова цель yarn.lock, но вопрос в том, почему package.json не имеет moment.js, пока он находится в файле yarn.lock? Спасибо - person Yang Wang; 18.06.2021