使用Babel和Gulp将ES6模块转换为AMD和CommonJS
ECMAScript 6(又名 ECMAScript 2015 或 ES6),下一个 JavaScript 版本的规范已经获得批准,浏览器供应商正在努力实现它。与之前版本的 ECMAScript 不同,ES6 对语言进行了大量更改,使其非常适合当今使用的规模。Sitepoint 有许多文章涵盖这些功能。
虽然浏览器还没有实现所有的功能,但我们已经可以在开发过程中利用 ES6 并在发布应用程序之前将其转换为浏览器可以理解的版本。Babel和Traceur是用于此目的的两个主要转译器。Microsoft 的 JavaScript 类型化超集TypeScript也可以用作 ES6 转译器。
我在之前的一篇文章中介绍了如何使用 ES6 来编写 Angular 1.x 应用程序。在那篇文章中,我使用 Traceur 的即时转译器来运行应用程序。虽然它可以工作,但最好提前进行转译并减少在浏览器中完成的工作量。在本文中,我们将看到如何将相同的示例应用程序转换为 ES5 并将模块转换为 CommonJS 或 AMD 使用 Babel 使其在当今的浏览器上运行。尽管该示例基于 Angular,但转译技术可用于任何有效的 ES6 代码。
与以往一样,您可以在我们的 GitHub 存储库中找到本文随附的代码。 模块的重要性
任何用于编写大型应用程序的语言的关键特性之一是能够以模块的形式加载应用程序的不同部分。模块不仅可以帮助我们保持代码更干净,而且还可以减少全局范围的使用。除非其他模块显式加载它,否则任何其他模块都无法使用模块的内容。
模块的重要性不仅限于应用程序。即使是大型 JavaScript 库也可以利用模块系统将其对象导出为模块,并且使用这些库的应用程序可以根据需要导入这些模块。Angular 2 和Aurelia已经开始使用这个特性。
如果您想快速了解在 ES6 中使用模块,请阅读:了解 ES6 模块 关于示例应用程序
我们的示例应用程序的主题是一个虚拟书架。它由以下页面组成: 主页:显示可以标记为已读或移至存档的活动书籍列表。 添加书页:通过接受书名和作者姓名将新书添加到书架。它不允许重复的标题。 存档页面:列出所有已存档的书籍。
该应用程序是使用 AngularJS 1.3 和 ES6 构建的。如果您查看文件app夹中的任何文件,您将看到用于从当前模块导出对象和从其他模块导入对象的关键字export和。import现在,我们的工作是使用Babel 的 Gulp 任务将这些模块转换为现有的模块系统之一。 但我没有使用 Angular。我只想将 ES6 模块转换为 CommonJS/AMD
不用担心!我们为您提供保障。通过少量的调整,下面演示的配方可以用于任何涉及 ES6 模块的项目。Angular 在这里并不重要。 转换为 CommonJS
CommonJS 是由CommonJS 组定义的模块系统。它是一个同步模块系统,其中模块使用函数加载并使用对象的属性require导出。默认情况下,该对象应在所有模块中可用。exportsmodulemodule
Node.js 使用这个模块系统,因此它在module本地定义对象并使其可用于您的应用程序。由于浏览器没有定义这个对象,我们需要使用一个叫做Browserify的工具来填补这个空白。
在开始之前,我们还需要安装一些 npm 包。这些将使我们能够将 Babel 和 Browserify 与 Gulp 结合使用,将我们的 ES6 模块转换为一种常见的模块格式,并将应用程序打包为单个文件供浏览器使用。 gulp-babel — 将 ES6 代码转换为原生 ES5 Browserify require("modules") -通过捆绑所有依赖项让您在浏览器中 乙烯基源流- 直接处理 Browserify 模块,避免需要 gulp-browserify 包装器 乙烯基缓冲区- 将流转换为缓冲区(对于不支持流的 gulp-uglify 是必需的) gulp - uglify — 缩小文件 del — 让您删除文件和文件夹 gulp-rename — 一个让你重命名文件的插件
您可以通过键入以下内容获得此批次: npm install gulp-babel browserify gulp-browserify vinyl-source-stream vinyl-buffer gulp-uglify del gulp-rename --save-dev
现在让我们开始在我们的gulpfile.js. 我们需要编写一个任务来获取所有 ES6 文件并将它们传递给 Babel。Babel 中默认的模块系统是 CommonJS,所以我们不需要向 babel 函数发送任何选项。 var babel = require("gulp-babel"), browserify = require("browserify"), source = require("vinyl-source-stream"), buffer = require("vinyl-buffer"), rename = require("gulp-rename"), uglify = require("gulp-uglify"), del = require("del"); gulp.task("clean-temp", function(){ return del(["dest"]); }); gulp.task("es6-commonjs",["clean-temp"], function(){ return gulp.src(["app/*.js","app/**/*.js"]) .pipe(babel()) .pipe(gulp.dest("dest/temp")); });
希望这里没有什么太令人困惑的地方。我们正在声明一个名为的任务 es6-commonjs,它会抓取 app 目录及其任何子目录中的所有 JavaScript 文件。然后它将它们通过 Babel 管道传输,Babel 又将单个文件转换为 ES5 和 CommonJS 模块,并将转换后的文件复制到dest/temp文件夹中。该 es6-commonjs任务有一个名为 的依赖项,它将在任务运行之前clean-temp删除dest目录和其中的所有文件。es6-commonjs
如果你想让代码更明确并指定模块系统,你可以将 Babel 的用法修改为: .pipe(babel({ modules:"common" }))
现在我们可以通过应用 Browserify 来从这些单独的文件中创建一个单独的捆绑文件,然后使用 uglify 包缩小输出。以下片段显示了这一点: gulp.task("bundle-commonjs-clean", function(){ return del(["es5/commonjs"]); }); gulp.task("commonjs-bundle",["bundle-commonjs-clean","es6-commonjs"], function(){ return browserify(["dest/temp/bootstrap.js"]).bundle() .pipe(source("app.js")) .pipe(buffer()) .pipe(uglify()) .pipe(rename("app.js")) .pipe(gulp.dest("es5/commonjs")); });
上面的任务有两个依赖:第一个是bundle-commonjs-clean删除目录的任务,es5/commonjs第二个是前面讨论过的es6-commonjs任务。一旦这些运行,任务将组合和缩小的文件app.js放在文件夹中es5/commonjs。该文件可以直接在中引用index.html,页面可以在浏览器中查看。
最后,我们可以添加一个任务来启动: gulp.task("commonjs", ["commonjs-bundle"]); 转换为 AMD
异步模块定义(AMD)系统,顾名思义,是一个异步模块加载系统。它允许多个依赖模块并行加载,并且在尝试加载其他模块之前不会等待一个模块完全加载。
Require.js是用于与 AMD 一起工作的库。RequireJS 可通过 Bower 获得: bower install requirejs --save
我们还需要用于 require.js 的 Gulp 插件来捆绑应用程序。为此安装gulp-requirejsnpm 包。 npm install gulp-requirejs --save-dev
现在我们需要编写将 ES6 代码转换为 ES5 和 AMD 的任务,然后使用 RequireJS 将其捆绑。这些任务与 CommonJS 部分中创建的任务非常相似。 var requirejs = require("gulp-requirejs"); gulp.task("es6-amd",["clean-temp"], function(){ return gulp.src(["app/*.js","app/**/*.js"]) .pipe(babel({ modules:"amd" })) .pipe(gulp.dest("dest/temp")); }); gulp.task("bundle-amd-clean", function(){ return del(["es5/amd"]); }); gulp.task("amd-bundle",["bundle-amd-clean","es6-amd"], function(){ return requirejs({ name: "bootstrap", baseUrl: "dest/temp", out: "app.js" }) .pipe(uglify()) .pipe(gulp.dest("es5/amd")); }); gulp.task("amd", ["amd-bundle"]);
要在 index.html 页面上使用最终脚本,我们需要添加对 RequireJS 的引用,即生成的脚本,然后加载bootstrap模块。bootstrap.js文件夹内的app文件引导 AngularJS 应用程序,所以我们需要加载它来启动 AngularJS 应用程序。 结论
模块是 JavaScript 中一个姗姗来迟的特性。它们将在 ES6 中出现,但不幸的是,它们的原生浏览器支持目前很差。但是,这并不意味着您今天不能使用它们。在本教程中,我演示了如何使用 Gulp、Babel 和各种插件将 ES6 模块转换为可以在浏览器中运行的 CommonJS 和 AMD 格式。
至于 ES6?ES6 自发布以来就在社区中引起了广泛关注。它已经被几个 JavaScript 库或框架使用,包括 Bootstrap 的 JavaScript 插件、Aurelia、Angular 2 和其他几个。TypeScript 还增加了对一些 ES6 特性的支持,包括模块。今天学习和使用 ES6,将减少将来转换代码所需的工作量。
加密市场行情下挫,波卡逆势夺冠波动性牢牢地控制着市场,市场情绪进一步下降到中轨区域内。从加密市场情绪分析服务Omenics提供的数据来看,10个主要币种的综合移动7日平均加密市场情绪得分(sentscore)连
永远相信美好的事情正在发生,小米11发布会米粉好幸福2020年对于小米来说确实是艰难奋发的一年,作为小米成立的第十个周年,小米10成了小米进军高端手机市场的一步好棋,小米一改以往中端机市场的品牌形象,开始向高端手机市场发力。就在12
行业最顶级屏幕!旗舰机锁门员小米11全面升级,你还在嫌贵?近日,小米的新品发布会上,雷军携满满诚意带来了震撼全场的小米11。被米粉们称为弥补短板不惜一切代价打造出来的小米又一全新力作,小米11究竟价值几何?让我们来一起看一看。小米11的最
雷军直播透露小米11,新款环保版热销高达两万台12月28日,万众瞩目的小米发布会开启,作为2020旗舰机收官之作小米11进入大众事业,为了此次的新品发售,小米集团可谓是用心良苦,无论是雷军一改往日低调在微博上为其造势,还是将发
小米11强势来袭,超奢侈四曲面屏幕预约超百万,即将开售小米11的发布会在12月28日正式举行了,不得不承认小米11的成功震撼了在场的所有观众。2K画质120Hz高刷的屏幕,可以说是成本行业最贵的,屏幕素质远远超过苹果和三星,可见雷军不
超酷!小米11终于来了,足够震撼,准备好了吗?12月28日晚,被受期待的小米11,终于发布了!小米11闪亮登场,赚足了大众眼球。正如外界期待,小米11在各个方面强大的性能,高端的配置,堪称王者,下面就来给大家分析一下。在手机屏
CapitalMarkets认为苹果应该购买比特币投资银行RBCCapitalMarkets认为,苹果应该购买比特币,并推出加密交易所,这一言论是在今天早些时候特斯拉15亿美元购买比特币之后发表的。RBC表示,与苹果传闻中的电动汽
DeFi基于数字ID的信用解决方案继ProBit交易所和EasyFi合作巩固当前中心化和去中心化金融之间的鸿沟之后,EASY继1月份上市之后,现在将在即将到来的ProBit专属莱特上亮相。ProBit交易所已经完成
比特币是新的GameStop吗?从上周开始,GameStop就一直占据着全球新闻圈。一群千禧一代正在向价值数十亿美元的对冲基金开战,他们买入了这些对冲基金大量做空的股票,包括GameStopAMC和黑莓。Game
DeFi会吃下摩根,但在吃这顿饭之前是有风险的去中心化金融(defi)协议估计将在十年或二十年内成长为高高在上的传统金融代替品,如美国主要投行摩根大通,但仍有一些特定的固有的风险需要处理。加密研究公司Messari的研究分析师
Coinbase选择在纳斯达克直接上市经过几个月的猜测,总部位于旧金山的加密交易所Coinbase最近宣布计划通过直接上市。现在,TheBlock报道称,该公司将在纳斯达克上市。(Coinbase没有证实该报道)。Co