Ecmascript 6 es6模块是否否定了browserify/webpack的需要?

Ecmascript 6 es6模块是否否定了browserify/webpack的需要?,ecmascript-6,browserify,webpack,Ecmascript 6,Browserify,Webpack,ES6模块允许我们创建可以作为依赖项导出和导入的代码模块 Browserify和Webpack做同样的事情。那么,如果我使用ES6和babel之类的工具来传输我的代码,那么就不需要webpack和browserify了,这是对的吗?如果您在浏览器中使用它,您当前仍然需要webpack或browserify。 让我们看一个例子: 以下 import * as name from 'name.js'; 变成: 'use strict'; function _interopRequireWildc

ES6模块允许我们创建可以作为依赖项导出和导入的代码模块


Browserify和Webpack做同样的事情。那么,如果我使用ES6和babel之类的工具来传输我的代码,那么就不需要webpack和browserify了,这是对的吗?

如果您在浏览器中使用它,您当前仍然需要webpack或browserify。

让我们看一个例子:

以下

import * as name from 'name.js';
变成:

'use strict';

function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj['default'] = obj; return newObj; } }

var _nameJs = require('name.js'); // Here, a function named "require" is still needed

var name = _interopRequireWildcard(_nameJs);

如您所见,babel依赖于方法
require
(实际上是它的任何实现)来进行导入。由于node.js实现了CommonJS,它可以工作,但目前没有浏览器实现它。恐怕两者都没有。

如前所述-ES6模块有两个方面:

ES6模块标准包括两部分:

  • 声明性语法(用于导入和导出)
  • 程序加载器 API:配置模块的加载方式和条件加载 模块
Babel只处理第一个方面,即用于导入和导出的声明性语法,不提供自己的加载程序

今天使用ES6模块的人通常会做以下事情之一:

  • 使用Babel将ES6模块语法传输到CommonJS/AMD等现有模块实现,然后可以使用Webpack/browserify/requirejs等可用工具加载/绑定js资产
  • 或者,也有类似的加载程序,它们提供对编程加载程序API的支持(通过使用此工具,您确实可以摆脱Browserify/Webpack,但到目前为止,您只是在用一种工具替换另一种工具。随着越来越多的库(如ES6模块)接受ES6模块,并推荐标准化的
    系统。导入
    语法-SystemJS将大受欢迎
另一个方面是与现有模块生态系统的兼容性(特别是在npm上)。值得注意的是,您并没有因为这两种策略而失去与现有生态系统的兼容性:webpack和SystemJS都允许加载和绑定commonjs以及AMD模块

就资产捆绑而言,HTTP 2中的持久连接支持已经显著降低了javascript文件连接的价值。尽管在完整javascript捆绑的丑陋化后消除死代码仍然是一个有价值的优化


正如诸如此类工具的作者反复指出的那样,ES6模块的静态分析特性使树抖动和死代码消除更加有效。

目前我想说有三点。如果我错了,请纠正我

  • 如果您想让用户获得最佳性能,那么es6modules会更好。有些情况下,es6modules的性能确实更好(http请求更少,缓存更好),而有些情况下,es6modules的性能更差

  • browserify
    与目前最常用的包管理器--
    npm
    集成得更好

  • 使用es6modules时,您必须指定
    节点_modules
    中模块的相对路径,而不是像
    browserify
    那样仅指定模块名称。您可以编写预处理器来解决es6modules的此问题,并在构建过程中执行它(如果不是相对路径,则只需更改路径).但这当然是额外的工作,browserify提供了开箱即用的功能

    此外,npm注册表中的大多数模块可能使用commonjs语法,而不是es6modules语法。这意味着,如果您想直接从npm使用模块,您必须使用它来利用es6modules的优势

    注意:AFAIK将es6modules语法转换为其他语法(如babel)并不能保留es6modules语法的优点

  • 当您使用es6modules时,可能还会有某种构建过程(如第二点所述,或者如果您还想缩小或做其他事情)。使用
    browserify
    可以使用非常好的工具,使开发非常方便,以便您能够以有效的方式工作,例如
    watchify
    ,由于缓存,它确实显著增加了生成所需的时间

  • ES6模块定义了一个语法。Browserify/Webpack捆绑模块使它们在浏览器(尤其是旧的)中工作。它们一起工作,不能相互替换。这个答案已经过时了。