NPM,Bower,Browserify,Gulp,Grunt和Webpack


1886

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

  • npmbower是包裹经理。他们只是下载依赖项,而不知道如何自行构建项目。他们知道什么是调用webpack/ gulp/ grunt获取所有的依赖后。
  • bower类似于npm,但是构建了一个扁平的依赖树(与npm递归地执行不同)。含义将npm获取每个依赖项的依赖项(可能会获取相同的几次),同时bower希望您手动包含子依赖项。有时,bowernpm分别分别用于前端和后端(因为前端中每个兆字节可能都很重要)。
  • grunt并且gulp是任务执行者,可以自动化所有可以自动化的内容(例如,编译CSS / Sass,优化图像,制作捆绑包并缩小/翻译)。
  • gruntvs. gulp(类似于mavenvs. gradle或配置vs.代码)。Grunt基于配置单独的独立任务,每个任务打开/处理/关闭文件。Gulp需要较少的代码量,并且基于Node流,这使其可以构建管道链(无需重新打开同一文件)并使其更快。
  • webpackwebpack-dev-server)-对我来说,这是一个任务执行程序,它具有对更改进行热重新加载的功能,使您无需理会所有JS / CSS监视程序。
  • npm// bower插件可以代替任务运行器。它们的能力经常相交,因此如果您需要使用gulp/ gruntover npm+插件,则会有不同的含义。但是任务运行者绝对适合复杂任务(例如“在每个构建中创建捆绑包,从ES6移植到ES5,在所有浏览器模拟器上运行它,制作屏幕截图并通过ftp部署到保管箱”)。
  • browserify允许为浏览器打包节点模块。browserifyvs node's require实际上是AMD vs CommonJS

问题:

  1. 什么是webpackwebpack-dev-server官方文档说这是一个模块捆绑器,但对我来说只是一个任务运行器。有什么不同?
  2. 您将在哪里使用browserify?我们不能对node / ES6导入做同样的事情吗?
  3. 您何时会使用gulp/ gruntover npm+插件?
  4. 当您需要组合使用时,请提供示例

52
是时候添加汇总了吗?😝–
gman

167
这是一个非常合理的问题。伪网络开发者喜欢我绊倒了在每周一次的方式实现的所有包..
西蒙Dirmeier


41
@Fisherman我对此完全陌生,而且似乎完全是
疯了

13
@Fisherman我刚刚读到的“推荐”评论甚至更糟!D:我只想构建一个使用了几个CSS / JS库的静态页面,并且会受益于拥有一个可以将它们一起编译的工具。 / Ctrl-V手指,那将是完美的选择...然而,经过数小时的努力,仍在努力寻找前进的方向...
David Stosik

Answers:


1027

Webpack和Browserify

Webpack和Browserify几乎完成了相同的工作,即处理要在目标环境(主要是浏览器,尽管您可以将Node等其他环境作为目标)中使用的代码。这种处理的结果是一个或多个捆绑包 -适用于目标环境的组合脚本。

例如,假设您编写了分为模块的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脚本之间进行选择取决于团队的品味和经验。

尽管对于不那么熟悉JS的人来说,Gulp或Grunt中的任务很容易阅读,但它是又一个需要学习的工具,我个人更喜欢缩小依赖范围并使事情变得简单。另一方面,用NPM脚本和运行那些第3方工具(例如,出于清洁目的而配置和运行rimraf的 Node脚本)组合的NPM脚本和(合适的JS)脚本来代替这些任务可能更具挑战性。但是在大多数情况下,这三个结果是相等的。


例子

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

准确地说,start.js创建客户端和服务器端捆绑包,启动Express服务器,并在成功启动后初始化Browser-sync,在编写本文时,它看起来像这样(有关最新代码,请参考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,在其中自动生成更改后的资产检测和热模块更换。如您所见,还有另一个配置属性,files其中包含单独的文件或模式浏览器同步监视更改并在发生更改时重新加载浏览器,但是正如评论所述,Webpack会通过HMR自行监视js源,因此它们可以协作那里。

现在我没有任何类似的Grunt或Gulp配置示例,但是对于Gulp(和Grunt有点类似),您可以在gulpfile.js中编写单个任务,例如

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

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

这次使用任务运行程序,您实际上将执行与入门工具包中几乎相同的操作,这为您解决了一些问题,但提出了自己的问题以及学习用法时遇到的一些困难,正如我所说,您拥有的依赖项越多,出错的可能性就越大。这就是我喜欢摆脱此类工具的原因。


3
好答案!请您描述一下webpack / browserify在浏览器中管理重用节点模块的方式吗?
VB_

4
Webpack将依赖项(导出的模块值)组装到对象(installedModules)中。因此,每个模块都是该对象的属性,并且该属性的名称表示其ID(例如1、2、3等)。每当您的源代码中需要这样的模块时,webpack都会将值转换为带有参数中模块ID的函数调用(例如__webpack_require __(1)),该函数将根据在installModules中按模块ID进行的搜索返回正确的依赖关系。我不确定Browserify如何处理它。
DanMacák'16

@DanSkočdopole您能否详细说明?
Asim KT

1
我不同意介绍gulp或grunt的基本用法,这两个易于使用Google进行比较,webpack-dev-server需要首先了解webpack,这超出了这个问题/答案的范围,但是我已经提出了一些Browsersync配置。您对入门工具包是正确的,我对此进行了详细说明。
丹·马克(DanMacák)

5
+1用于减少依赖关系以使事情简单,而不是遵循(更多)必须使用每个新软件包的流行观点!
madannes '17

675

2018年10月更新

如果您仍然不确定Front-end开发人员,可以在这里快速查看出色的资源。

https://github.com/kamranahmedse/developer-roadmap

2018年6月更新

如果您从一开始就没有去过那里,那么学习现代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。这不是一个真正的问题,只是让每个试图理解一条清晰道路的人感到困惑。

无论如何,我想贡献一点。

1.包管理器

程序包管理器简化了项目依赖项的安装和更新,这些依赖项是库,例如:jQuery, Bootstrap等等-在您的站点上使用且未由您编写的所有内容。

浏览所有图书馆网站,下载和解压缩档案,将文件复制到项目中-所有这些都由终端中的一些命令代替。

  • NPM代表:Node JS package manager帮助您管理软件所依赖的所有库。您将在一个名为的文件中定义您的需求,package.jsonnpm install在命令行中运行...然后BANG,您的软件包已下载并可以使用。都可用于front-end and back-end库。

  • Bower:对于前端软件包管理,其概念与NPM相同。您所有的库都存储在一个名为的文件中bower.json,然后bower install在命令行中运行。

Bower和之间的最大区别NPM是NPM确实嵌套了依赖树,而Bower需要如下所示的平坦依赖树。

引用Bower和npm有什么区别?

NPM

project root
[node_modules] // default directory for dependencies
 -> dependency A
 -> dependency B
    [node_modules]
    -> dependency A

 -> dependency C
    [node_modules]
    -> dependency B
      [node_modules]
       -> dependency A 
    -> dependency D

凉亭

project root
[bower_components] // default directory for dependencies
 -> dependency A
 -> dependency B // needs A
 -> dependency C // needs B and D
 -> dependency D

中有一些更新npm 3 Duplication and Deduplication,请打开文档以获取更多详细信息。

  • Yarn:最近JavaScript 发布的新软件包管理器,Facebook与相比,它具有更多优势NPM。使用Yarn,您仍然可以同时使用NPMBower注册表来获取软件包。如果您以前安装过软件包,yarn创建一个缓存副本,以便于offline package installs

  • jspm:是SystemJS在动态ES6模块加载器之上构建的通用模块加载器的软件包管理器。它不是具有自己的一组规则的全新软件包管理器,而是可以在现有软件包源之上运行。开箱即用,它可与GitHub和一起使用npm。由于大多数Bower基础软件包都基于GitHub,因此我们可以使用jspm。它有一个注册表,其中列出了大多数常用的前端软件包,以便于安装。

见之间的不同Bowerjspm包管理器:鲍尔VS JSPM


2.模块加载器/捆绑

任何规模的大多数项目的代码都将分为多个文件。您可以只在每个文件中包含一个单独的<script>标签,但是会<script>建立一个新的http连接,对于小型文件(这是模块化的目标),建立连接的时间可能比传输数据要花费更长的时间。在下载脚本时,无法在页面上更改任何内容。

  • 下载时间问题可以通过将一组简单模块串联到一个文件中并进行最小化来解决。

例如

<head>
    <title>Wagon</title>
    <script src=“build/wagon-bundle.js”></script>
</head>
  • 但是,性能是以牺牲灵活性为代价的。如果您的模块具有相互依赖性,则缺乏灵活性可能会成为热门。

例如

<head>
    <title>Skateboard</title>
    <script src=“connectors/axle.js”></script>
    <script src=“frames/board.js”></script>
    <!-- skateboard-wheel and ball-bearing both depend on abstract-rolling-thing -->
    <script src=“rolling-things/abstract-rolling-thing.js”></script>
    <script src=“rolling-things/wheels/skateboard-wheel.js”></script>
    <!-- but if skateboard-wheel also depends on ball-bearing -->
    <!-- then having this script tag here could cause a problem -->
    <script src=“rolling-things/ball-bearing.js”></script>
    <!-- connect wheels to axle and axle to frame -->
    <script src=“vehicles/skateboard/our-sk8bd-init.js”></script>
</head>

计算机可以做得比您更好,这就是为什么您应该使用一种工具将所有内容自动捆绑到一个文件中的原因。

然后我们听说RequireJSBrowserifyWebpackSystemJS

  • RequireJS:是JavaScript文件和模块加载器。它针对浏览器内使用进行了优化,但可以在其他JavaScript环境中使用,例如Node

例如:myModule.js

// package/lib is a dependency we require
define(["package/lib"], function (lib) {

    // behavior for our module
    function foo() {
        lib.log( "hello world!" );
    }

    // export (expose) foo to other modules as foobar
    return {
        foobar: foo
    }
});

在中main.js,我们可以导入myModule.js为依赖项并使用它。

require(["package/myModule"], function(myModule) {
    myModule.foobar();
});

然后在我们中HTML,我们可以参考使用with RequireJS

<script src=“app/require.js data-main=“main.js ></script>

阅读更多有关CommonJSAMD轻松理解。 CommonJS,AMD和RequireJS之间的关系?

  • Browserify:开始允许CommonJS在浏览器中使用格式化的模块。因此,Browserify模块加载器不如模块捆绑器那么多:Browserify完全是一个构建时工具,可以生成一堆代码,然后可以在客户端进行加载。

从安装了node&npm的构建机器开始,并获取软件包:

npm install -g save-dev browserify

CommonJS格式编写模块

//entry-point.js
var foo = require('../foo.js');
console.log(foo(4));

并在高兴时发出捆绑命令:

browserify entry-point.js -o bundle-name.js

Browserify递归地找到入口点的所有依赖项,并将它们组合成一个文件:

<script src=”bundle-name.js”></script>
  • Webpack:它将所有静态资产(包括JavaScript,图像,CSS等)捆绑到一个文件中。它还使您能够通过不同类型的加载程序来处理文件。您可以编写JavaScriptwith CommonJSAMDmodules语法。它从根本上更加集成和自觉地攻击了构建问题。在Browserify您中,使用Gulp/Grunt一长串的转换和插件来完成工作。Webpack提供了通常不需要Grunt或根本不需要的足够的电源Gulp

基本用法非常简单。像Browserify一样安装Webpack:

npm install -g save-dev webpack

并向命令传递一个入口点和一个输出文件:

webpack ./entry-point.js bundle-name.js
  • SystemJS:是一个模块加载器,可以在运行时以当今(CommonJS, UMD, AMD, ES6)使用的任何流行格式导入模块。它建立在ES6模块加载程序polyfill 之上,并且足够智能,可以检测到所使用的格式并进行适当处理。SystemJS还可以转换ES6代码(使用BabelTraceur)或其他语言(例如TypeScriptCoffeeScript使用插件)。

想知道是什么node module以及为什么它不适用于浏览器。

更有用的文章:


为什么jspmSystemJS

其中一个主要目标,ES6模块化是使其真正简单的安装和使用任何Javascript库从互联网上的任何地方(Githubnpm,等)。只需要两件事:

  • 单个命令即可安装库
  • 一行代码即可导入库并使用它

因此jspm,您可以做到。

  1. 使用以下命令安装库: jspm install jquery
  2. 只需单行代码即可导入库,而无需在HTML文件内部进行外部引用。

display.js

var $ = require('jquery'); 

$('body').append("I've imported jQuery!");
  1. 然后,您可以System.config({ ... })在导入模块之前在其中进行配置。通常,在运行时jspm init,将config.js为此目的命名一个文件。

  2. 为了使这些脚本运行,我们需要的负载system.jsconfig.js在HTML页面上。之后,我们将display.js使用SystemJS模块加载器加载文件。

index.html

<script src="jspm_packages/system.js"></script>
<script src="config.js"></script>
<script>
  System.import("scripts/display.js");
</script>

注意:您也可以将其npmWebpackAngular 2一起使用。由于jspm开发是为了与之集成,SystemJS并且可以在现有npm资源的基础上工作,因此您的答案取决于您。


3.任务执行器

任务运行器和构建工具主要是命令行工具。为什么需要使用它们:一句话:自动化。在执行重复性任务(如缩小,编译,单元测试,整理)时,您要做的工作较少,以前这些操作花费了我们很多时间来处理命令行甚至手动操作。

  • Grunt:您可以为开发环境创建自动化功能,以预处理代码或使用配置文件创建构建脚本,这似乎很难处理复杂的任务。在最近几年流行。

其中的每个任务Grunt都是一系列不同的插件配置,这些插件配置以严格独立且顺序的方式一个接一个地执行。

grunt.initConfig({
  clean: {
    src: ['build/app.js', 'build/vendor.js']
  },

  copy: {
    files: [{
      src: 'build/app.js',
      dest: 'build/dist/app.js'
    }]
  }

  concat: {
    'build/app.js': ['build/vendors.js', 'build/app.js']
  }

  // ... other task configurations ...

});

grunt.registerTask('build', ['clean', 'bower', 'browserify', 'concat', 'copy']);
  • Gulp:自动化就像Grunt配置,而不是配置,您可以JavaScript像它是节点应用程序一样使用流进行编写。这些天比较喜欢。

这是一个Gulp示例任务声明。

//import the necessary gulp plugins
var gulp = require('gulp');
var sass = require('gulp-sass');
var minifyCss = require('gulp-minify-css');
var rename = require('gulp-rename');

//declare the task
gulp.task('sass', function(done) {
  gulp.src('./scss/ionic.app.scss')
    .pipe(sass())
    .pipe(gulp.dest('./www/css/'))
    .pipe(minifyCss({
      keepSpecialComments: 0
    }))
    .pipe(rename({ extname: '.min.css' }))
    .pipe(gulp.dest('./www/css/'))
    .on('end', done);
});

查看更多:https : //medium.com/@preslavrachev/gulp-vs-grunt-why-one-why-the-other-f5d3b398edc4#.fte0nahri


4.脚手架工具

  • Slush and Yeoman:您可以使用它们创建入门项目。例如,您计划使用HTML和SCSS构建原型,而不是手动创建诸如scss,css,img,字体之类的文件夹。您可以只安装yeoman并运行一个简单的脚本。然后,这里的一切都为您服务。

在这里找到更多。

npm install -g yo
npm install --global generator-h5bp
yo h5bp

查看更多:https : //www.quora.com/What-are-the-differences-between-NPM-Bower-Grunt-Gulp-Webpack-Browserify-Slush-Yeoman-and-Express


我的答案与问题的内容并不完全匹配,但是当我在Google上搜索这些知识时,我总是会在顶部看到该问题,因此我决定对它进行总结。希望你们觉得对您有帮助。


64

好的,它们都有一些相似之处,它们以不同和相似的方式为您做相同的事情,我将它们分为以下三个主要组


1)模块捆绑器

webpack和browserify是流行的工具,像任务运行器一样工作,但具有更大的灵活性,因为aslo会将所有内容捆绑在一起作为您的设置,因此您可以将结果作为bundle.js指向一个示例,例如在一个包含CSS和Javascript的文件中,每种的更多详细信息,请查看以下详细信息:

网络包

webpack是用于现代JavaScript应用程序的模块捆绑器。当webpack处理您的应用程序时,它会递归地构建一个依赖关系图,其中包括您的应用程序需要的每个模块,然后将所有这些模块打包到少量的捆绑软件中-通常只有一个-由浏览器加载。

它是可配置的,但是要开始使用,您只需要了解四个核心概念:入口,输出,装载程序和插件。

本文档旨在对这些概念进行高层概述,同时提供指向详细概念特定用例的链接。

这里更多

浏览器

Browserify是一个开发工具,使我们可以编写node.js样式的模块,这些模块可以在浏览器中使用进行编译。就像节点一样,我们将模块写入单独的文件中,并使用module.exports和export变量导出外部方法和属性。我们甚至可以使用require函数来要求其他模块,如果省略相对路径,它将解析为node_modules目录中的模块。

这里更多


2)任务赛跑者

gulp和grunt是任务运行者,基本上是他们的工作,创建任务并在需要时运行它们,例如,安装插件以最小化CSS,然后每次运行以最小化CSS,有关每个细节,

吞咽

gulp.js是Fractal Innovations和GitHub的开源社区提供的一个开源JavaScript工具包,在前端Web开发中用作流式构建系统。它是基于Node.js和Node Package Manager(npm)构建的任务运行程序,用于自动化Web开发中涉及的耗时且重复的任务,如缩小,串联,缓存清除,单元测试,整理,优化等。gulp使用一种配置上代码的方法来定义其任务,并依靠其小型,单一用途的插件来执行任务。gulp生态系统有1000多个此类插件可供选择。

这里更多

咕unt

Grunt是JavaScript任务运行程序,该工具用于自动执行常用的任务,如缩小,编译,单元测试,整理等。它使用命令行界面来运行在文件(称为Gruntfile)中定义的自定义任务。 。Grunt由Ben Alman创建,并使用Node.js编写。它通过npm分发。目前,在Grunt生态系统中有超过五千个插件可用。

这里更多


3)包裹经理

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

npm

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

这里更多

凉亭

Bower可以管理包含HTML,CSS,JavaScript,字体甚至图像文件的组件。Bower不会串联或缩小代码或执行其他任何操作-只是安装所需的正确版本的软件包及其依赖项。首先,Bower的工作原理是从各处获取并安装软件包,并负责寻找,查找,下载和保存所需的内容。Bower在清单文件bower.json中跟踪这些软件包。

更多 这里

以及不容错过的最新软件包管理器,它在实际工作环境中还年轻而快速,与我之前主要使用的npm相比,重新安装模块时,它会仔细检查node_modules文件夹以检查模块是否存在,似乎安装模块所需的时间更少:

Yarn是您的代码的包管理器。它使您可以使用代码,并与世界各地的其他开发人员共享代码。Yarn快速,安全且可靠地执行此操作,因此您不必担心。

Yarn允许您使用其他开发人员的解决方案来解决不同的问题,从而使您更轻松地开发软件。如果遇到问题,您可以报告问题或做出贡献,当问题解决后,您可以使用Yarn保持最新状态。

通过称为包(有时称为模块)的东西共享代码。软件包包含要共享的所有代码以及描述该软件包的package.json文件。

这里更多



是否有gulp插件列表?真的有1000多个吗?npm只返回20左右?
flurbius

1
很棒的总结。应该是任何有关现代Web开发的讨论的切入点。
亚当·布布拉

1
@flurbius是的,在这里:gulpjs.com/plugins。当前似乎有3,465个Gulp插件。
mts knn

52

您可以在npmcompare上找到一些技术比较

比较Browserify,Grunt,Gulp和Webpack

如您所见,webpack维护得很好,平均每4天就会发布一个新版本。但是Gulp似乎拥有最大的社区(Github上有超过2万颗星)。Grunt似乎被忽略了(与其他人相比)

因此,如果需要选择一个,我会选择Gulp


5
webpack现在在Github和gulp上以25.7k的速度启动26k。无法再使用人气因素来决定了……
Rayee Roded


14

什么是webpack&webpack-dev-server?官方文档说这是一个模块捆绑器,但对我来说只是一个任务运行器。有什么不同?

webpack-dev-server是一个实时重载的Web服务器,Webpack开发人员使用该服务器立即获得他们所做的反馈。仅应在开发期间使用。

该项目的灵感主要来自nof5单元测试工具。

的WebPack顾名思义将创建一个 年龄为网络。该软件包将被最小化,并组合成一个文件(我们仍然生活在HTTP 1.1时代)。Webpack神奇地结合了资源(JavaScript,CSS,图像)并像这样注入它们:<script src="assets/bundle.js"></script>

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

您将在哪里使用browserify?我们不能对node / ES6导入做同样的事情吗?

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

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

您何时会在npm +插件上使用gulp / grunt?

您会忘记 Gulp,Grunt,Brokoli,Brunch和Bower。直接使用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'),

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


14

Yarn是最近的软件包管理器,可能值得一提。
因此,这里是:https : //yarnpkg.com/

据我所知,它可以获取npm和bower依赖关系,并具有其他令人赞赏的功能。


12

Webpack是捆绑器。就像Browserfy在代码库中查找模块请求(requireimport)并递归地解决它们。而且,您不仅可以配置Webpack为解析类似于JavaScript的模块,而且还可以解析CSS,图像,HTML以及几乎所有内容。让我特别兴奋的是Webpack,您可以在同一应用程序中组合编译模块和动态加载模块。因此,特别是通过HTTP / 1.x可以真正提高性能。我在此处的示例中描述了您如何精确地做到这一点http://dsheiko.com/weblog/state-of-javascript-modules-2017/ 作为捆绑器的替代者,您可以想到Rollup.jshttps://rollupjs.org/) ,可在编译期间优化代码,但会剥离所有找到的未使用的块。

对于AMDRequireJS本机可以代替ES2016 module system,但可以使用System.jshttps://github.com/systemjs/systemjs

此外,我要指出的是,npm它通常用作grunt或的自动化工具gulp。查看https://docs.npmjs.com/misc/scripts。我个人现在使用npm脚本只是避免使用其他自动化工具,尽管过去我非常喜欢grunt。使用其他工具,您必须依靠无数的插件来编写软件包,而这些插件通常编写得不好并且没有得到积极维护。npm知道它的软件包,因此您可以按以下名称调用本地安装的任何软件包:

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

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

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.