我试图总结我对最流行的JavaScript包管理器、打包器和任务执行器的了解。如果我错了,请纠正我:

npm和bower是软件包经理。他们只是下载依赖项,不知道如何自己构建项目。他们知道的是在获取所有依赖项后调用webpack/gulp/grunt。bower类似于npm,但构建了一个扁平的依赖树(不像npm递归地执行)。这意味着npm获取每个依赖项的依赖项(可能会多次获取相同的依赖项),而bower希望您手动包含子依赖项。有时bower和npm分别用于前端和后端(因为每个兆字节在前端可能很重要)。gulf和gulf是任务执行器,可以自动完成所有可以自动化的任务(即编译CSS/Sass、优化图像、制作捆绑包和缩小/透明文件)。咕噜vs咕噜(就像maven vs gradle或配置vs代码)。Grunt基于配置单独的独立任务,每个任务打开/处理/关闭文件。Gulp需要更少的代码,并且基于节点流,这允许它构建管道链(不重新打开相同的文件),并使其更快。webpack(webpack-dev-server)-对我来说,它是一个任务运行器,可以热重新加载更改,让你忘记所有JS/CSS观察者。npm/bower+插件可能会取代任务运行器。他们的能力经常交叉,所以如果你需要在npm+插件上使用gulp/grunt,就会有不同的含义。但任务运行器对于复杂的任务来说无疑是更好的(例如,“在每个构建上创建捆绑包,从ES6到ES5转换,在所有浏览器模拟器上运行它,制作屏幕截图并通过ftp部署到dropbox”)。browserify允许为浏览器打包节点模块。browserify vs node的需求实际上是AMD vs CommonJS。

问题:

什么是webpack和webpack开发服务器?官方文档说它是一个模块打包器,但对我来说,它只是一个任务执行器。有什么不同?你会在哪里使用browserify?我们不能对节点/ES6导入执行同样的操作吗?你什么时候会对npm+插件使用gulp/grunt?当您需要使用组合时,请提供示例


当前回答

Webpack和Browserify

Webpack和Browserify做的工作几乎相同,即处理要在目标环境中使用的代码(主要是浏览器,但也可以针对Node等其他环境)。这种处理的结果是一个或多个适合目标环境的捆绑脚本。

例如,假设您编写了分成模块的ES6代码,并希望能够在浏览器中运行它。如果这些模块是Node模块,浏览器将无法理解它们,因为它们只存在于Node环境中。ES6模块也不能在IE11这样的旧浏览器中工作。此外,您可能使用了浏览器尚未实现的实验性语言特性(ES下一个建议),因此运行这样的脚本只会抛出错误。Webpack和Browserify等工具通过将这些代码转换为浏览器能够执行的形式来解决这些问题。除此之外,他们还可以对这些捆绑包应用各种各样的优化。

然而,Webpack和Browserify在许多方面都有所不同,Webpack默认提供了许多工具(例如代码拆分),而Browserify只能在下载插件后才能做到这一点,但使用这两种工具会产生非常相似的结果。这取决于个人喜好(Webpack更时尚)。顺便说一句,Webpack不是一个任务运行器,它只是文件的处理器(它通过所谓的加载程序和插件处理文件),它可以由任务运行器运行(以及其他方式)。


Webpack开发人员服务器

Webpack开发服务器提供了与Browsersync类似的解决方案-在开发服务器上,您可以在开发应用程序时快速部署应用程序,并立即验证开发进度,开发服务器会在代码更改时自动刷新浏览器,甚至将更改的代码传播到浏览器,而无需重新加载所谓的热模块替换。


任务执行者与NPM脚本

我一直在使用Gulp,因为它简洁明了,易于编写任务,但后来发现我根本不需要Gulp和Grunt。我所需要的一切都可以使用NPM脚本通过其API运行第三方工具来完成。在Gulp、Grunt或NPM脚本之间进行选择取决于团队的品味和经验。

虽然Gulp或Grunt中的任务即使对于不太熟悉JS的人来说也很容易阅读,但这是另一个需要学习的工具,我个人更喜欢缩小依赖关系,使事情变得简单。另一方面,用运行这些第三方工具的NPM脚本和(可能是JS)脚本的组合来替换这些任务(例如,节点脚本配置和运行rimraf以进行清理)可能更具挑战性。但在大多数情况下,这三者的结果是相等的。


示例

至于示例,我建议您看看这个React starter项目,它向您展示了涵盖整个构建和部署过程的NPM和JS脚本的完美组合。您可以在根文件夹的package.json中的名为scripts的属性中找到这些NPM脚本。在那里,您将主要遇到babel node tools/run start之类的命令。Babel节点是一个CLI工具(不用于生产),它首先编译ES6文件tools/run(位于工具中的run.js文件)-基本上是一个runner实用程序。这个运行程序将一个函数作为参数并执行它,在本例中它是start-另一个实用程序(start.js),负责绑定源文件(客户端和服务器)并启动应用程序和开发服务器(开发服务器可能是Webpack dev server或Browsersync)。

更准确地说,start.js创建了客户端和服务器端捆绑包,启动了一个express服务器,并在成功启动后初始化了浏览器同步,在编写本文时是这样的(请参阅react starter项目以获取最新代码)。

const bs = Browsersync.create();  
bs.init({
      ...(DEBUG ? {} : { notify: false, ui: false }),

      proxy: {
        target: host,
        middleware: [wpMiddleware, ...hotMiddlewares],
      },

      // no need to watch '*.js' here, webpack will take care of it for us,
      // including full page reloads if HMR won't work
      files: ['build/content/**/*.*'],
}, resolve)

重要的部分是proxy.target,他们在其中设置要代理的服务器地址,该地址可以是http://localhost:3000,并且Browsersync启动服务器侦听http://localhost:3001,其中生成的资产被用于自动变化检测和热模块更换。正如您所看到的,还有另一个配置属性文件,其中包含单独的文件或模式。浏览器同步会监视更改并在发生某些更改时重新加载浏览器,但正如评论所说,Webpack会自行使用HMR监视js源,因此它们会在那里进行协作。

现在我没有任何类似Grunt或Gulp配置的示例,但使用Gulp(和Grunt有点类似),您可以在gulfile.js中编写单独的任务,如

gulp.task('bundle', function() {
  // bundling source files with some gulp plugins like gulp-webpack maybe
});

gulp.task('start', function() {
  // starting server and stuff
});

在这里,你将要做的事情基本上与初学者工具包中的相同,这一次是任务执行器,它为你解决了一些问题,但在学习使用过程中会出现自己的问题和一些困难,正如我所说的,依赖性越多,就越可能出错。这就是我喜欢摆脱这种工具的原因。

其他回答

Webpack和Browserify

Webpack和Browserify做的工作几乎相同,即处理要在目标环境中使用的代码(主要是浏览器,但也可以针对Node等其他环境)。这种处理的结果是一个或多个适合目标环境的捆绑脚本。

例如,假设您编写了分成模块的ES6代码,并希望能够在浏览器中运行它。如果这些模块是Node模块,浏览器将无法理解它们,因为它们只存在于Node环境中。ES6模块也不能在IE11这样的旧浏览器中工作。此外,您可能使用了浏览器尚未实现的实验性语言特性(ES下一个建议),因此运行这样的脚本只会抛出错误。Webpack和Browserify等工具通过将这些代码转换为浏览器能够执行的形式来解决这些问题。除此之外,他们还可以对这些捆绑包应用各种各样的优化。

然而,Webpack和Browserify在许多方面都有所不同,Webpack默认提供了许多工具(例如代码拆分),而Browserify只能在下载插件后才能做到这一点,但使用这两种工具会产生非常相似的结果。这取决于个人喜好(Webpack更时尚)。顺便说一句,Webpack不是一个任务运行器,它只是文件的处理器(它通过所谓的加载程序和插件处理文件),它可以由任务运行器运行(以及其他方式)。


Webpack开发人员服务器

Webpack开发服务器提供了与Browsersync类似的解决方案-在开发服务器上,您可以在开发应用程序时快速部署应用程序,并立即验证开发进度,开发服务器会在代码更改时自动刷新浏览器,甚至将更改的代码传播到浏览器,而无需重新加载所谓的热模块替换。


任务执行者与NPM脚本

我一直在使用Gulp,因为它简洁明了,易于编写任务,但后来发现我根本不需要Gulp和Grunt。我所需要的一切都可以使用NPM脚本通过其API运行第三方工具来完成。在Gulp、Grunt或NPM脚本之间进行选择取决于团队的品味和经验。

虽然Gulp或Grunt中的任务即使对于不太熟悉JS的人来说也很容易阅读,但这是另一个需要学习的工具,我个人更喜欢缩小依赖关系,使事情变得简单。另一方面,用运行这些第三方工具的NPM脚本和(可能是JS)脚本的组合来替换这些任务(例如,节点脚本配置和运行rimraf以进行清理)可能更具挑战性。但在大多数情况下,这三者的结果是相等的。


示例

至于示例,我建议您看看这个React starter项目,它向您展示了涵盖整个构建和部署过程的NPM和JS脚本的完美组合。您可以在根文件夹的package.json中的名为scripts的属性中找到这些NPM脚本。在那里,您将主要遇到babel node tools/run start之类的命令。Babel节点是一个CLI工具(不用于生产),它首先编译ES6文件tools/run(位于工具中的run.js文件)-基本上是一个runner实用程序。这个运行程序将一个函数作为参数并执行它,在本例中它是start-另一个实用程序(start.js),负责绑定源文件(客户端和服务器)并启动应用程序和开发服务器(开发服务器可能是Webpack dev server或Browsersync)。

更准确地说,start.js创建了客户端和服务器端捆绑包,启动了一个express服务器,并在成功启动后初始化了浏览器同步,在编写本文时是这样的(请参阅react starter项目以获取最新代码)。

const bs = Browsersync.create();  
bs.init({
      ...(DEBUG ? {} : { notify: false, ui: false }),

      proxy: {
        target: host,
        middleware: [wpMiddleware, ...hotMiddlewares],
      },

      // no need to watch '*.js' here, webpack will take care of it for us,
      // including full page reloads if HMR won't work
      files: ['build/content/**/*.*'],
}, resolve)

重要的部分是proxy.target,他们在其中设置要代理的服务器地址,该地址可以是http://localhost:3000,并且Browsersync启动服务器侦听http://localhost:3001,其中生成的资产被用于自动变化检测和热模块更换。正如您所看到的,还有另一个配置属性文件,其中包含单独的文件或模式。浏览器同步会监视更改并在发生某些更改时重新加载浏览器,但正如评论所说,Webpack会自行使用HMR监视js源,因此它们会在那里进行协作。

现在我没有任何类似Grunt或Gulp配置的示例,但使用Gulp(和Grunt有点类似),您可以在gulfile.js中编写单独的任务,如

gulp.task('bundle', function() {
  // bundling source files with some gulp plugins like gulp-webpack maybe
});

gulp.task('start', function() {
  // starting server and stuff
});

在这里,你将要做的事情基本上与初学者工具包中的相同,这一次是任务执行器,它为你解决了一些问题,但在学习使用过程中会出现自己的问题和一些困难,正如我所说的,依赖性越多,就越可能出错。这就是我喜欢摆脱这种工具的原因。

好的,他们都有一些相似之处,他们以不同和相似的方式为你做相同的事情,我将他们分为以下三个主要组:1) 模块打包机

webpack和browserify作为流行的浏览器,工作方式类似于任务运行器,但具有更大的灵活性,因为它将根据您的设置将所有内容捆绑在一起,因此您可以将结果指向bundle.js,例如在一个文件中,包括CSS和Javascript,有关每个文件的详细信息,请查看以下详细信息:

网络包

webpack是现代JavaScript应用程序的模块打包器。什么时候webpack处理您的应用程序,它递归地构建依赖项包含应用程序所需的每个模块的图形,然后是包所有这些模块都分成少量的捆绑包,通常只有一个-以由浏览器加载。它是难以置信的可配置,但要开始,您只需要了解四个核心概念:输入、输出、加载程序和插件。本文件旨在从高层次概述概念,同时提供详细概念的链接使用案例。

这里有更多

浏览,浏览

Browserify是一个开发工具,它允许我们编写node.js-style编译以在浏览器中使用的模块。就像node,我们写我们的模块在单独的文件中,导出外部方法和使用module.exports和exports变量的财产。我们甚至可以使用require函数要求其他模块,如果省略它将解析到node_modules中的模块的相对路径目录

这里有更多


2) 任务执行者

gulf和gulf是任务运行器,基本上是它们所做的,创建任务并随时运行它们,例如,您安装了一个插件来缩小CSS,然后每次运行它来缩小,详细信息如下:

gulp

gull.js是Fractal Innovations的开源JavaScript工具包以及GitHub的开源社区,用作流媒体构建系统前端web开发。它是一个基于Node.js和节点包管理器(npm),用于web开发中涉及的耗时且重复的任务,如缩小、连接、缓存破坏、单元测试、删除、,优化等。gulf使用代码覆盖配置的方法来定义其任务,并依靠其小型、单一用途的插件执行它们。gulf生态系统有1000多个这样的插件可用选择。

这里有更多

咕哝

Grunt是一个JavaScript任务执行器,用于自动执行常用任务,如缩小、编译、单位它使用命令行界面运行自定义文件中定义的任务(称为Gruntfile)。Grunt由创建Ben Alman和用Node.js编写。它通过npm发布。目前,在Grunt生态系统。

这里有更多


3) 包管理器

包管理器,他们所做的是管理应用程序中所需的插件,并使用package.json通过github等为您安装这些插件,非常方便地更新您的模块,安装它们并共享您的应用程序,每个插件的详细信息:

npm

npm是JavaScript编程语言的包管理器。它是JavaScript运行时环境的默认包管理器Node.js。它由一个命令行客户端(也称为npm)和一个公共包的在线数据库,称为npm注册表。这个注册表通过客户端访问,可用的包可以通过npm网站浏览和搜索。

这里有更多

弓箭手

Bower可以管理包含HTML、CSS、JavaScript和字体的组件甚至图像文件。Bower不会连接或缩小代码其他任何东西-它只安装正确版本的软件包您的需要及其依赖关系。首先,Bower通过从全程负责狩猎、查找、下载和保存你要找的东西。Bower在清单文件bower.json。

这里有更多

最新的包管理器不应该错过,它在实际工作环境中比我以前经常使用的npm更年轻,速度更快。对于重新安装模块,它会仔细检查node_modules文件夹以检查模块的存在,而且安装模块所需的时间也更短:

yarn

Yarn是代码的包管理器。它允许您使用和与世界各地的其他开发人员共享代码。纱线可以做到这一点快速、安全、可靠,因此您不必担心。Yarn允许您使用其他开发人员的解决方案问题,使您更容易开发软件。如果你如果您有问题,您可以报告问题或提供反馈问题已经解决,您可以使用Yarn使其保持最新。代码通过称为包的东西共享(有时引用作为模块)。一个包还包含所有共享的代码作为描述包的package.json文件。

这里有更多


Webpack是一个bundler。与Browservy一样,它在代码库中查找模块请求(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模块系统,而不是使用RequireJS,而是使用system.js加载(https://github.com/systemjs/systemjs)

此外,我想指出的是,npm经常被用作一种自动化工具,如gulf或gulf。退房https://docs.npmjs.com/misc/scripts.我个人现在只使用npm脚本,避免使用其他自动化工具,尽管过去我非常喜欢咕哝。使用其他工具,您必须依赖无数插件来创建包,这些插件通常编写得不好,也没有得到积极维护。npm知道它的软件包,所以您可以通过以下名称调用任何本地安装的软件包:

{
  "scripts": {
    "start": "npm http-server"
  },
  "devDependencies": {
    "http-server": "^0.10.0"
  }
}

实际上,如果软件包支持CLI,则通常不需要任何插件。

Yarn是最近的一个包装经理,可能值得一提。因此,这里是:https://yarnpkg.com/

据我所知,它可以获取npm和bower依赖项,并具有其他值得赞赏的特性。

什么是webpack和webpack开发服务器?官方文档说它是一个模块打包器,但对我来说,它只是一个任务执行器。有什么不同?

webpack-dev-server是一个实时重载的web服务器,webpack开发人员使用它来获得即时反馈。它只应在开发期间使用。

这个项目深受nof5单元测试工具的启发。

顾名思义,Webpack将为web创建一个SINGLE包。该包将被最小化,并合并为一个文件(我们仍然生活在HTTP 1.1时代)。Webpack的神奇之处在于将资源(JavaScript、CSS、图像)组合在一起,并像这样注入它们:<script src=“assets/bundle.js”></script>。

它也可以称为模块绑定器,因为它必须了解模块依赖关系,以及如何获取依赖关系并将它们绑定在一起。

你会在哪里使用browserify?我们不能对节点/ES6导入执行同样的操作吗?

您可以在与使用Webpack完全相同的任务上使用Browserify。–不过,Webpack更紧凑。

请注意,Webpack2中的ES6模块加载器功能使用的是System.import,这不是一个浏览器本机支持的。

你什么时候会对npm+插件使用gulp/grunt?

你可以忘记古尔普、格朗特、布罗科利、早午餐和鲍尔。直接使用npm命令行脚本代替,您可以为Gulp消除以下额外的包:

var gulp        = require('gulp'),
  minifyCSS     = require('gulp-minify-css'),
  sass          = require('gulp-sass'),
  browserify    = require('gulp-browserify'),
  uglify        = require('gulp-uglify'),
  rename        = require('gulp-rename'),
  jshint        = require('gulp-jshint'),
  jshintStyle   = require('jshint-stylish'),
  replace       = require('gulp-replace'),
  notify        = require('gulp-notify'),

在为项目创建配置文件时,您可能可以使用Gulp和Grunt配置文件生成器。这样,您就不需要安装Yeoman或类似工具。