已关闭。此问题需要更多focused。当前不接受答案。
**想要改进此问题吗?**更新问题,使其仅关注editing this post的一个问题。
去年关闭了。
去年,机构群体审查了是否重新讨论此问题,并将其关闭:
原始关闭原因未解决
Improve this question
我试图总结一下我对最流行的JavaScript包管理器、捆绑器和任务运行器的了解。如果我说错了,请纠正我:
npm
和bower
是包管理器,他们只是下载依赖项,不知道如何自己构建项目,他们知道的是在获取所有依赖项后调用webpack
/gulp
/grunt
。bower
类似于npm
,但构建了一个扁平的依赖关系树(与npm
不同,npm
是递归执行的)。(可以多次获取相同的内容),而bower
要求您手动包含子依赖项。有时,bower
和npm
一起用于前端和后端-因为每兆字节在前端可能都很重要。grunt
和gulp
是任务运行器,用于自动化所有可以自动化的任务(例如编译CSS/Sass、优化图像、制作捆绑包和缩小/移植)。grunt
vs.gulp
(就像maven
vs.gradle
或配置vs.代码)。Grunt基于配置单独的独立任务,每个任务打开/处理/关闭文件。Gulp需要更少的代码量,并且基于节点流,这允许它构建管道链(无需重新打开同一个文件),并使其更快。webpack
(webpack-dev-server
)-对我来说,它是一个热重新加载更改的任务运行程序,可以让你忘记所有的JS/CSS监视器。npm
/bower
+插件可能会取代任务运行器。它们的功能经常会交叉,所以如果你需要使用gulp
/grunt
而不是npm
+插件,会有不同的含义。但是任务运行器肯定更适合复杂的任务(例如,“在每次构建时创建捆绑包,从ES6迁移到ES 5,在所有浏览器模拟器上运行,进行截屏并通过ftp部署到Dropbox”)。browserify
允许为浏览器打包节点模块。browserify
与node
的require
实际上是AMD vs CommonJS。
问题:
1.* 什么是webpack
和webpack-dev-server
?* 官方文档说它是一个模块捆绑器,但对我来说它只是一个任务运行器。* 有什么区别?*
1.* 您将在何处使用browserify
?我们不能对node/ES6导入执行相同操作吗?*
1.* 您何时会在npm
+插件上使用gulp
/grunt
?*
1.* 需要使用组合时请提供示例 *
7条答案
按热度按时间edqdpe6u1#
Webpack和浏览器化
Webpack和Browserify做的工作几乎是一样的,就是处理你的代码,以便在目标环境中使用(主要是浏览器,尽管你可以针对其他环境,如Node)。这样处理的结果是一个或多个bundle-适合目标环境的汇编脚本。
例如,假设您编写了分成模块的ES6代码,并希望能够在浏览器中运行它。如果这些模块是Node模块,浏览器将无法理解它们,因为它们只存在于Node环境中。ES6模块也无法在IE11等旧版浏览器中运行。此外,您可能使用了实验性语言功能(ES的下一个建议),浏览器还没有实现,所以运行这样的脚本只会抛出错误。Webpack和Browserify等工具通过将这些代码转换为浏览器能够执行的形式来解决这些问题。除此之外,它们还可以对这些捆绑包进行各种优化。
然而,Webpack和Browserify在很多方面都不同,Webpack默认提供了很多工具(例如代码拆分),而Browserify只能在下载插件后才能做到这一点,但两者都使用会导致非常相似的结果。这取决于个人偏好(Webpack更流行)。顺便说一句,Webpack不是一个任务运行程序,它只是你的文件的处理器(它通过所谓的加载器和插件来处理它们),并且它可以通过任务运行器来运行(在其他方式中)。
Webpack开发服务器
Webpack Dev Server提供了一个类似于Browsersync的解决方案-一个开发服务器,您可以在其中快速部署您的应用,并立即验证您的开发进度,开发服务器会在代码更改时自动刷新浏览器,甚至将更改的代码传播到浏览器,而无需通过所谓的热模块替换重新加载。
任务运行程序与NPM脚本
我一直在使用Gulp,因为它简洁且易于编写任务,但后来发现我根本不需要Gulp或Grunt。我所需要的一切都可以使用NPM脚本通过其API运行第三方工具来完成。在Gulp、Grunt或NPM脚本之间进行选择取决于您的团队的品味和经验。
虽然Gulp或Grunt中的任务即使对不太熟悉JS的人来说也很容易阅读,但它是另一个需要和学习的工具,我个人更喜欢缩小我的依赖关系,使事情简单。另一方面,将这些任务替换为NPM脚本和(可能是JS)运行这些第三方工具的脚本(例如节点脚本配置和运行rimraf以进行清理)可能更具挑战性。但在大多数情况下,这三个结果是相等的。
示例
至于示例,我建议您看一下这个React starter project,它展示了NPM和JS脚本的完美组合,涵盖了整个构建和部署过程。在名为
scripts
的属性中。在这里,您通常会遇到类似babel-node tools/run start
的命令。Babel-node是一个CLI工具(不用于生产),它首先编译ES6文件tools/run
(run.js文件位于tools)-基本上是一个runner实用程序。这个runner将一个函数作为参数并执行它,在本例中是start
-另一个实用程序(start.js
),负责绑定源文件(客户端和服务器)并启动应用程序和开发服务器(开发服务器可能是Webpack Dev Server或Browsersync)。更准确地说,
start.js
创建客户端和服务器端包,启动一个快速服务器,并在成功启动后初始化Browser-sync,在编写本文时是这样的(请参考react starter project以获取最新代码)。最重要的部分是
proxy.target
,在这里他们设置他们想要代理的服务器地址,可能是http://localhost:3000,Browsersync启动一个服务器监听http://localhost:3001,在这里生成的资产被提供了自动变更检测和热模块替换。还有另一个配置属性files
,其中包含单独的文件或模式。Browser-sync监视更改,并在发生更改时重新加载浏览器,但正如注解所述,Webpack用HMR自己照顾看js源代码,所以他们在那里合作。现在我没有任何类似的Grunt或Gulp配置的例子,但是对于Gulp(与Grunt有些类似),您可以在gulpfile.js中编写单独的任务,如
在这里你要做的基本上和初学者工具包里的一样,这次是任务运行器,它为你解决了一些问题,但是在学习使用的过程中,它也会出现一些问题和困难,就像我说的,依赖越多,出错的可能性就越大,这就是我想摆脱这些工具的原因。
8dtrkrch2#
2018年10月更新
如果您仍然不确定前端开发,您可以在这里快速浏览一个优秀的资源。
https://github.com/kamranahmedse/developer-roadmap
2018年6月更新
如果你从一开始就没有学过现代JavaScript,那么学习现代JavaScript是很坚韧的。如果你是新手,记得看看这篇优秀的文章,以便有一个更好的概述。
https://medium.com/the-node-js-collection/modern-javascript-explained-for-dinosaurs-f695e9747b70
2017年7月更新
最近我从Grab团队找到了一份关于2017年如何进行前端开发的综合指南。您可以查看以下内容。
https://github.com/grab/front-end-guide
我也一直在寻找这一点,因为有很多工具,每一个都在不同的方面给我们带来了好处。社区被划分为像
Browserify, Webpack, jspm, Grunt and Gulp
这样的工具。你可能也听说过Yeoman or Slush
。这不是问题,只是让每个试图理解明确前进道路的人感到困惑。不管怎样,我想贡献点什么。
目录
Bower
和NPM
之间的差异1.软件包管理器
软件包管理器简化了项目依赖项的安装和更新,这些依赖项是如下库:
jQuery, Bootstrap
等--您的网站上使用的所有内容,而不是由您编写的。浏览所有的图书馆网站,下载和解压缩档案,将文件复制到项目中-所有这些都被终端中的几个命令所取代。
NPM(一个数字)
它代表:
Node JS package manager
可以帮助您管理软件所依赖的所有库。您可以在一个名为package.json
的文件中定义您的需求,然后在命令行中运行npm install
......然后“砰”的一声,您的软件包就被下载并可以使用了。它可以用于front-end
和back-end
库。Bower(一个字母)
对于前端包管理,概念与NPM相同。所有库都存储在一个名为
bower.json
的文件中,然后在命令行中运行bower install
。Bower推荐他们的用户到migrate over to npm or yarn.请小心
Bower
与NPM
之间的差异Bower
和NPM
之间最大的区别是NPM做嵌套的依赖树,而Bower需要一个平面依赖树,如下所示。引用What is the difference between Bower and npm?
npm 3 Duplication and Deduplication
上有一些更新,请打开文档了解更多详细信息。Yarn的第一个字母
Facebook
最近为JavaScript
published开发的一个新的软件包管理器,与NPM
相比有更多的优点。使用Yarn,你仍然可以使用NPM
和Bower
注册表来获取软件包。如果你以前安装过软件包,yarn
会创建一个缓存副本,这有助于offline package installs
。第1431章:我的天啊
JSPM是
SystemJS
通用模块加载器的包管理器,构建在动态ES6
模块加载器之上。它不是一个拥有自己规则集的全新包管理器,而是在现有包源代码之上工作。开箱即用,它可以与GitHub
和npm
一起工作。由于大多数基于Bower
的软件包都是基于GitHub
的,我们也可以使用jspm
来安装这些软件包。它有一个注册表,列出了大多数常用的前端软件包,以便于安装。查看
Bower
和jspm
之间的差异:Package Manager: Bower vs jspm2.模块加载程序/捆绑
大多数项目的代码都被分割到几个文件中。您可以只在每个文件中包含一个单独的
<script>
标记,但是,<script>
会建立一个新的HTTP连接,对于小文件--这是模块化的目标--建立连接的时间可能比传输数据要长得多。当脚本下载时,页面上的任何内容都不能更改。例如
例如
计算机可以比你做得更好,这就是为什么你应该使用一个工具,自动捆绑到一个文件的一切。
然后我们听到了
RequireJS
,Browserify
,Webpack
和SystemJS
第1333章【第一更】
它是一个
JavaScript
文件和模块加载器。它针对浏览器中的使用进行了优化,但也可以用于其他JavaScript环境,如Node
。例如:我的模块.js
在
main.js
中,我们可以将myModule.js
作为依赖项导入并使用它。然后在我们的
HTML
中,我们可以引用与RequireJS
一起使用。阅读更多关于
CommonJS
和AMD
的信息,轻松理解。Relation between CommonJS, AMD and RequireJS?第1004章【第一更】
允许在浏览器中使用
CommonJS
的模块。因此,Browserify
与其说是一个模块加载器,不如说是一个模块捆绑器:Browserify
完全是一个构建时工具,生成一组代码,然后可以在客户端加载这些代码。从安装了节点& npm的构建计算机开始,并获取软件包:
以
CommonJS
编写模块而当高兴的时候,发出命令来管束:
Browserify递归地查找入口点的所有依赖项,并将它们组装到一个文件中:
Webpack的第一个字母
它捆绑了所有静态资产,包括
JavaScript
、图像、CSS等,到一个文件中。它还使你能够通过不同类型的加载程序来处理文件。你可以用CommonJS
或AMD
模块语法来编写你的JavaScript
。它以一种从根本上更加集成和固执己见的方式来解决构建问题。在Browserify
中,你使用Gulp/Grunt
和一长串的转换和插件来完成这项工作。Webpack
提供了足够的功能,你通常根本不需要Grunt
或Gulp
。基本的用法是超越简单。安装Webpack像Browserify:
并向该命令传递一个入口点和一个输出文件:
第1133章【第一更】
它是一个模块加载器,可以在运行时以当今使用的任何流行格式导入模块它构建在
ES6
模块加载程序polyfill之上,并且足够智能,能够检测正在使用的格式并进行适当处理。SystemJS
还可以转换ES6代码(使用Babel
或Traceur
)或使用插件的其他语言(如TypeScript
和CoffeeScript
)。想知道什么是
node module
,为什么它不能很好地适应浏览器。更有用的文章:
为什么选择
jspm
和SystemJS
?ES6
模块化的主要目标之一是使从Internet上的任何地方安装和使用任何Javascript库(Github
、npm
等)变得非常简单。因此,借助
jspm
,您可以做到这一点。1.使用以下命令安装库:
jspm install jquery
个1.导入库只需一行代码,无需在HTML文件内部进行外部引用。
显示.js
1.然后在导入模块之前在
System.config({ ... })
中配置这些内容。通常在运行jspm init
时,会有一个名为config.js
的文件用于此目的。1.要运行这些脚本,我们需要在HTML页面上加载
system.js
和config.js
,然后使用SystemJS
模块加载器加载display.js
文件。索引.html
注意:你也可以将
npm
与Webpack
一起使用,因为Angular 2已经应用了它。由于jspm
是为了与SystemJS
集成而开发的,并且它是在现有npm
源代码的基础上工作的,所以你的答案取决于你。3.任务运行程序
任务运行器和构建工具主要是命令行工具。为什么我们需要使用它们:一句话:自动化。在执行重复性任务(如缩小、编译、单元测试、擦除)时,您需要做的工作就越少,而这些任务以前需要花费我们大量的时间来使用命令行甚至手动执行。
第1244章【第一更】
你可以为你的开发环境创建自动化来预处理代码或者用一个配置文件创建构建脚本,这似乎很难处理一个复杂的任务。
Grunt
中的每个任务都是一个不同插件配置的数组,这些配置以严格独立和顺序的方式一个接一个地执行。Gulp的第一次
自动化就像
Grunt
一样,但你可以用流来编写JavaScript
,就像它是一个节点应用程序一样,而不是配置。这是一个
Gulp
示例任务声明。查看更多:https://preslav.me/2015/01/06/gulp-vs-grunt-why-one-why-the-other/
4.脚手架工具
雪泥和自耕农
你可以用它们创建一个入门项目。例如,你计划用HTML和SCSS构建一个原型,而不是手动创建一些文件夹,如scss,css,img,fonts。你可以只安装
yeoman
并运行一个简单的脚本。然后这里的一切都为你。查找更多here。
型
查看更多:https://www.quora.com/What-are-the-differences-between-NPM-Bower-Grunt-Gulp-Webpack-Browserify-Slush-Yeoman-and-Express
我的答案与问题的内容不匹配,但当我在谷歌上搜索这些知识时,我总是看到问题在上面,所以我决定概括地回答它。我希望你们能找到有用的答案。
如果你喜欢这篇文章,你可以在我的博客上阅读更多。感谢访问:)
toe950273#
好的,它们都有一些相似之处,它们以不同但相似的方式为您做同样的事情,我将它们分为3个主要组如下:
1)模块捆绑包
webpack和browserify是流行的,工作方式类似于任务运行器,但更灵活,它会将所有内容捆绑在一起作为您的设置,所以您可以将结果指向bundle.js,例如在一个包含CSS和Javascript的单个文件中,有关每个的更多详细信息,请查看下面的详细信息:
网络包
webpack是一个用于现代JavaScript应用程序的模块捆绑器。当webpack处理你的应用程序时,它递归地构建一个依赖关系图,其中包括你的应用程序所需要的每个模块,然后将所有这些模块打包成少量的捆绑包--通常只有一个--由浏览器加载。
它的可配置性令人难以置信,但要开始使用,您只需要了解四个核心概念:条目、输出、加载程序和插件。
本文档旨在对这些概念给予高层次的概述,同时提供指向详细概念特定用例的链接。
更多here
浏览器化
Browserify是一个开发工具,它允许我们编写node. js样式的模块,这些模块可以在浏览器中编译使用。就像node一样,我们在单独的文件中编写模块,使用module.exports和exports变量导出外部方法和属性。我们甚至可以使用require函数请求其他模块,如果我们省略了相对路径,它会解析到node_modules目录中的模块。
更多here
2)任务运行者
gulp和grunt是任务运行程序,基本上他们做什么,创建任务,并在你想的时候运行它们,例如你安装了一个插件来缩小你的CSS,然后每次运行它来做缩小,关于每一个的更多细节:
"咕噜"
gulp.js是由Fractal Innovations和GitHub开源社区开发的一个开源JavaScript工具包,用作前端Web开发中的流式构建系统。(NPM),用于自动执行Web开发中涉及的耗时且重复的任务,如缩小、连接、缓存破坏、单元测试、去毛优化等。Gulp使用代码覆盖配置的方法来定义其任务,并依靠其小型、单一用途的插件来执行这些任务。Gulp生态系统有1000多个这样的插件可供选择。
更多here
"咕噜"
Grunt是一个JavaScript任务运行器,一个用于自动执行常用任务的工具,如缩小、编译、单元测试、删除等。它使用命令行界面来运行文件(称为Gruntfile)中定义的自定义任务。Grunt由Ben Alman创建,用Node.js编写。它通过npm分发。目前,Grunt生态系统中有超过5000个插件可用。
更多here
3)软件包管理器
软件包管理器,他们所做的是管理插件,你需要在你的应用程序,并安装他们通过github等为您使用package.json,非常方便地更新您的模块,安装他们和共享您的应用程序,更多的细节为每个:
国家/分钟
npm是JavaScript编程语言的软件包管理器。它是JavaScript运行时环境Node.js的默认软件包管理器。它由一个命令行客户端(也称为npm)和一个公共软件包的联机数据库(称为npm注册表)组成。注册表通过客户端访问,可用的软件包可以通过npm网站浏览和搜索。
更多here
"船头"
Bower可以管理包含HTML、CSS、JavaScript、字体甚至图像文件的组件。Bower不会连接或缩小代码或做其他任何事情-它只会安装你需要的包的正确版本及其依赖项。开始时,Bower从各处获取并安装包,负责搜索、查找、下载并保存您要查找的内容。Bower在清单文件bower.json中跟踪这些包。
更多here
最新的软件包管理器也不容错过,与我以前经常使用的npm相比,它在真实的工作环境中更年轻、速度更快,在重新安装模块时,它会仔细检查node_modules文件夹以检查模块是否存在,而且安装模块所需的时间似乎更少:
Yarn
Yarn是一个代码包管理器。它允许您使用代码并与世界各地的其他开发人员共享代码。Yarn可以快速、安全、可靠地完成这一任务,因此您永远不必担心。
Yarn允许您使用其他开发人员的解决方案来解决不同的问题,使您更容易地开发自己的软件。如果您有问题,您可以报告问题或提供反馈,当问题得到解决时,您可以使用Yarn来保持所有内容的最新状态。
代码是通过一个包(有时也称为模块)来共享的。一个包包含所有共享的代码以及一个描述该包的package.json文件。
更多here
ct2axkht4#
您可以在npmcompare上找到一些技术比较
Comparing browserify vs. grunt vs. gulp vs. webpack
正如你所看到的,webpack维护得很好,平均每4天就有一个新版本出来。但是Gulp似乎拥有最大的社区(Github上有超过20K的明星)Grunt似乎有点被忽视(与其他相比)
所以如果要选一个的话,我会选Gulp
7lrncoxx5#
什么是webpack & webpack-dev-server?官方文档说它是一个模块捆绑器,但对我来说它只是一个任务运行器。有什么区别吗?
webpack-dev-server是一个实时重新加载的Web服务器,Webpack 开发人员可以使用它来获得即时反馈。它只应在开发期间使用。
这个项目受到了nof5单元测试工具的极大启发。
顾名思义,Webpack 将为web创建一个 SINGLE包时代。该包将被最小化,并组合成一个文件(我们仍然生活在HTTP 1.1时代)。Webpack 具有组合资源(JavaScript、CSS、图像)并注入它们的魔力,如下所示:
<script src="assets/bundle.js"></script>
.它也可以称为 * 模块捆绑器 ,因为它必须了解模块依赖关系,以及如何获取依赖关系并将它们捆绑在一起。
你会在哪里使用browserify?我们不能在node/ES6导入中做同样的事情吗?
您可以在使用 Webpack 的相同任务中使用 Browserify。- Webpack 更紧凑。
请注意, Webpack 2 * 中的ES6 module loader features使用的是 System.import,没有一个浏览器本身支持它。
你什么时候会在npm +插件上使用gulp/grunt?
您可以直接使用npm命令行脚本来代替forgetGulp、Grunt、Brokoli、Brunch和Bower,您可以消除额外的软件包,如以下针对 Gulp 的软件包:
在为项目创建配置文件时,你可以使用 Gulp 和 Grunt 配置文件生成器。这样你就不需要安装 Yeoman 或类似的工具。
osh3o9ms6#
Webpack
是一个捆绑器。像Browserfy
一样,它在代码库中查找模块请求(require
或import
),并递归地解析它们。更重要的是,您可以配置Webpack
来解析类似JavaScript的模块,还可以解析CSS、图像、HTML,几乎所有内容。Webpack
让我特别兴奋的是,你可以在同一个应用程序中合并编译的和动态加载的模块。因此,你可以获得真实的的性能提升,特别是在HTTP/1.x上。你是如何做到的我在这里用例子描述了http://dsheiko.com/weblog/state-of-javascript-modules-2017/作为bundler的替代品,你可以考虑Rollup.js
(https://rollupjs.org/),它在编译期间优化代码,但剥离所有找到的未使用的块。对于
AMD
,可以使用本机ES2016 module system
代替RequireJS
,但加载了System.js
(https://github.com/systemjs/systemjs)除此之外,我想指出的是,
npm
经常被用作一个自动化工具,比如grunt
或gulp
。看看https://docs.npmjs.com/misc/scripts。我个人现在只使用npm脚本,而不使用其他自动化工具,尽管过去我非常喜欢grunt
。使用其他工具,你必须依赖于无数的插件包,npm
知道它的软件包,所以你可以通过名称调用任何本地安装的软件包,比如:实际上,如果软件包支持CLI,通常不需要任何插件。
uyto3xhc7#
Yarn是最近的一个包经理,大概值得一提。
所以,这就是:https://yarnpkg.com/
据我所知,它可以获取npm和bower依赖项,并具有其他值得赞赏的特性。