您是否将Babel和Webpack放在devDependencies或Dependencies中?


76

我是npm的新手,并不真正了解依赖项与devDependencies的关系。我知道对于测试库,他们应该进入开发人员,但是对于babel和webpack这样的东西呢?它们是否也应该在dev中,因为它们仅用于将es6和JSX反编译为原始JS?我的理解是,当您部署到heroku时,它已经与必需的库进行了反编译,因此不需要将它们托管在生产环境中吗?

  "dependencies": {
    "babel-core": "^6.7.7",
    "babel-eslint": "^6.0.4",
    "babel-loader": "^6.2.4",
    "babel-plugin-react-transform": "^2.0.2",
    "babel-plugin-transform-object-rest-spread": "^6.6.5",
    "babel-plugin-transform-react-display-name": "^6.5.0",
    "babel-polyfill": "^6.7.4",
    "babel-preset-es2015": "^6.6.0",
    "babel-preset-react": "^6.5.0",
    "bootstrap": "^3.3.7",
    "css-loader": "^0.23.1",
    "es6-promise": "^3.2.1",
    "eslint": "^2.9.0",
    "eslint-plugin-babel": "^3.2.0",
    "eslint-plugin-react": "^5.0.1",
    "express": "^4.13.4",
    "extract-text-webpack-plugin": "^1.0.1",
    "file-loader": "^0.9.0",
    "lodash": "^4.15.0",
    "react": "^15.0.2",
    "react-addons-css-transition-group": "^15.0.2",
    "react-dom": "^15.0.2",
    "react-redux": "^4.4.5",
    "react-transform-catch-errors": "^1.0.2",
    "react-transform-hmr": "^1.0.4",
    "redbox-react": "^1.2.3",
    "redux": "^3.5.2",
    "redux-form": "^6.1.0",
    "rimraf": "^2.5.2",
    "style-loader": "^0.13.1",
    "webpack-dev-middleware": "^1.6.1",
    "webpack-hot-middleware": "^2.10.0"
  },
  "devDependencies": {
    "babel-register": "^6.9.0",
    "chai": "^3.5.0",
    "mocha": "^2.5.3",
    "sinon": "^1.17.4",
    "webpack": "^1.13.2"
  }

stackoverflow.com/questions/18875674/…。这将给您一些必要的清晰度!
semuzaboi

Answers:


61

babelwebpack包将进入devDependencies部分,因为这些包transpiling时使用,并捆绑-ING你的代码香草JavaScript中的bundle.js&等文件(S)。

在生产中,您将在bundle.js构建/生成的代码之外运行代码,不再需要这些依赖项。


在生产中,也只能使用babel来编译构建版本,您能帮助我理解吗?
Harkirat Saluja,2016年

2
在生产环境中,您的build或deploy文件夹将包含已由babel转换为ES5的内容。因此,您实际上并不需要他们来运行您的应用程序。
semuzaboi

41
一个例外是babel-polyfill,因为在运行时需要使用polyfill
HaoCS

2
@HaoCS我已经看到Babel的文档说要放入babel-polyfill依赖项,但是我不明白为什么。运行构建后,捆绑包中是否不包括它?我认为没有理由不能出现在devDependencies中。希望有更多的见识。
The Qodesmith '18

11
为了回应Harkirat的问题(以及回答该问题的评论),对如何部署存在一些假设。当人们说“ Babel是开发人员的依赖项”时,他们期望您将Babel编译的代码提交到Git(或您使用的任何工具)中,然后将编译后的代码部署到服务器上。在这种情况下,Babel是一个开发依赖项,因为它永远不会在服务器上运行。但是,如果您改为提交常规代码并在服务器上运行Babel,则可能不希望将其作为开发依赖项,因为服务器需要它。
machineghost

24

尽管基本上每个人都说了些什么,但我还是要提个理智……这确实很简单:

您的项目npm install将由另一个项目编辑吗?aka您是否正在编写npm模块?它会结束另一个项目package.json吗?

没有?

然后放进去dependencies

是?

  • dependencies:您希望项目的下游使用者和项目开发人员安装的东西:
  • peerDependencies:下游用户需要确保已安装的内容
  • bundleDependencies:下游用户将需要的东西,并且不需要单独安装,因为在您安装时npm publish,这些东西将与您的软件包“捆绑在一起”。
  • optionalDependencies:很不错但没有的东西不会导致致命错误
  • devDependencies:仅在您的项目上使用的东西。

简而言之就是:模块不会神奇地得到不同的安装。他们要么被安装,要么没有被安装。


我认为它被拼写为“依赖项”
卡梅伦特

6
对于常规应用程序(不是npm lib),将所有内容放到一起dependencies意味着您的开发工具将随您的应用程序一起投入生产。馊主意。
jfroy

@jfroy,请您确认一下吗?就像来源链接一样 我记得我们的一个js开发人员提到过,当webpack构建并捆绑js代码时,它将检查是否导入了软件包,然后决定是否应该对其进行打包。但是,打包babel不太可能被导入并在应用程序代码中使用,对吗?在这种情况下,即使将babel添加到依赖项中,也不会将其打包,对吗?谢谢
Jeff Chen

2
@JeffChen,看看npm docs中的定义:docs.npmjs.com/files/package.json#dependencies。他们特别警告不要将编译器置于依赖状态。Webpack和其他打包程序所应用的摇树确实会删除生产构建中未使用的代码,从而删除任何错误分配的dev依赖项,但是此答案中没有任何内容清楚地表明这是他们依靠它们来定义不正确的package.json的理由。
jfroy

2
@jfroy我们使用docker多阶段构建。因此,您的关注都与您无关。实际上,最终生产中唯一的东西就是输出js / css / png / etc包。真。为了解决前端依赖关系的分离而付出的努力甚至不值得回报。
airtonix

-5

Dev依赖关系仅用于开发服务器,它们是devDepedency:所有未在源代码中使用或未导入的包都是devDependencies

"babel-cli": "^6.26.0",
"babel-core": "^6.26.0",
"babel-loader": "^7.1.4",
"babel-preset-env": "^1.6.1",
"babel-preset-react": "^6.24.1",
"clean-webpack-plugin": "^0.1.19",
"copy-webpack-plugin": "^4.5.1",
"css-loader": "^0.28.11",
"file-loader": "^1.1.11",
"html-webpack-plugin": "^3.2.0",
"mini-css-extract-plugin": "^0.4.0",
"node-sass": "^4.8.3",
"optimize-css-assets-webpack-plugin": "^4.0.0",
"prop-types": "^15.6.1",
"sass-loader": "^7.0.1",
"style-loader": "^0.21.0",
"uglifyjs-webpack-plugin": "^1.2.5",
"webpack": "^4.6.0",
"webpack-cli": "^3.1.1",
"webpack-dev-server": "^3.1.9"

6
这些是构建应用程序所必需的。这完全取决于您在哪里构建应用程序。
Earl3s
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.