你把Babel和Webpack放在devDependencies或Dependencies中吗?

sta*_*lei 51 javascript dependencies packages package-managers npm

我是npm的新手,并不真正了解应该依赖于devDependencies的内容.我知道,对于测试库,他们应该进入dev,但对于像babel和webpack这样的东西呢?他们是不是也应该在dev中,因为他们只是用来将es6和JSX转换成vanilla 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"
  }
Run Code Online (Sandbox Code Playgroud)

Zoh*_*jaz 40

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

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

  • 一个例外是babel-polyfill,因为在运行时需要polyfill:https://babeljs.io/docs/usage/polyfill/ (32认同)
  • 为了回应Harkirat的问题(以及回答它的评论),对于如何部署有一些假设.当人们说"Babel是开发依赖"时,他们希望你将Babel编译的代码提交到Git(或者你使用的任何东西),然后将编译后的代码部署到你的服务器上.在那种情况下,Babel是一个dev依赖项,因为它永远不会在服务器上运行.但是,如果您提交正常代码,并在服务器上运行Babel,您可能不希望它作为dev依赖项,因为服务器需要它. (6认同)
  • 虽然这对于 NodeJs env 来说完全有意义,但当涉及到前端项目时,人们可以有不同的想法。事实上,对于前端项目,您不需要包,只需要捆绑文件。无论是 Webpack、Babel 还是 React 都没关系。在我的项目中,我将构建生产包所需的所有内容存储在“dependency”中,并将我在开发中使用的所有工具存储在“devDependency”中。这本质上意味着 Webpack 最终会出现在依赖项中,玩笑 - 在 devDependency 中。 (4认同)
  • @HaoCS 我看到 Babel 的文档说要将 `babel-polyfill` 放在依赖项中,但我不明白为什么。一旦构建运行,捆绑包不会包含它吗?我认为没有理由它不能在 devDependencies 中。会喜欢更多的洞察力。 (3认同)
  • 在生产中,您的构建或部署文件夹将具有已由babel转换为ES5的内容.因此,您实际上不需要它们来运行您的应用程序. (2认同)

air*_*nix 8

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

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

没有?

然后放进去dependencies

是?

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

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

  • 对于常规应用程序(不是 npm 库),将所有内容都放在“依赖项”中意味着您的开发工具将与生产中的应用程序一起部署。馊主意。 (15认同)
  • @jfroy,你能确认一下吗?就像来源链接一样。我记得我们的一位 js 开发人员提到,当 webpack 构建并捆绑 js 代码时,它会检查包是否已导入,然后决定是否应该打包它。但是,babel 包不太可能被导入并在应用程序代码中使用,对吧?这样的话,就算把babel添加到依赖中,那也不会被打包吧?谢谢 (3认同)
  • @JeffChen,看看 npm 文档中的定义:https://docs.npmjs.com/files/package.json#dependency。他们特别警告不要将转译器置于依赖关系中。Webpack 和其他打包器应用的 Tree Shaking 确实会删除生产构建中未使用的代码,从而删除任何错误分配的开发依赖项,但此答案中没有任何内容明确表明他们依赖于此来证明定义不明确的 package.json 的合理性。 (3认同)
  • @jfroy我们使用docker多阶段构建。所以你的担忧都不重要。事实上,最终在生产中产生的唯一结果是输出 js/css/png/etc 包。真的。为了解决前端依赖关系的分离而付出的努力根本不值得回报。 (3认同)