原文标题:Looking at Drupal 8's JavaScript Changes 作者:Rob Ballou
本文由晓晓翻译,龙马校对,转载请注明出处:http://longma.org/looking-at-drupal-8-javascript-changes
最近,我有幸在2012年度的BADCamp上做关于JavaScript(JS)的发言。这给了我一次很好的机会去谈论我钟爱的东西,顺便谈谈在最新版的Drupal平台中都将会有哪些方面的变化。我已经听到了一些这样或者那样的变化,但是究竟有哪些变化呢?
首先,事情总是在变化着。我的意思是,在一定范围内,Drupal 7 和Drupal 8之间是有差异的,并且还会继续更新。这是意料之中的,如果你一直跟随着使用一个新产品,不过让我们先看几个例子:
编码标准
第一件需要注意的是现在使用JSHint检查语法和编码标准,它在JS核心文件里。你可以在问题队列上查看JSHint的配置。许多编辑器都能整合进你的发布流程里,或者你可以直接在命令行里运行(我个人特别喜欢Node.js和NPM)。这个像Drupal的PHP编码标准一样只是建议不是必须,不过长远来看这样对你的代码更有利!
库变化
另一个更新点是在核心文件里,这里新增了两个文件underscore.js 和backbone.js。这两个库属于核心库,因此给了他们一个新的目录 core/misc。underscore.js可以使编写JS更加简单、backbone.js是一个JS的应用级框架。但是请注意,JS库已经和原来发生了变化。Drupal默认假设你不需要jQuery,Drupal的JS或者其它JS库。编码的时候你要指定需要的库,并且使它们成为“顶层闭包”的一部分。这该怎么做?
在PHP端的平台,你的模块可能需要调用一个叫做hook_library_info的钩子,它不仅定义了你的模块要用那个JS并且还指定了你的模块要包含那些库。下面是从Node模块中拿出来的例子:
function node_library_info() { $libraries['drupal.node'] = array( 'title' => 'Node', 'version' => VERSION, 'js' => array( drupal_get_path('module', 'node') . '/node.js' => array(), ), 'dependencies' => array( array('system', 'jquery'), array('system', 'drupal'), array('system', 'drupalSettings'), array('system', 'drupal.form'), ), );
Node模块的例子里展示了系统将要包含的JS文件,以及依赖核心系统的四个库。我还提到了一个奇特的东西听起来称作“顶层闭包”的,对吗?
在Drupal 7里鼓励开发者把自己的代码封闭起来。但是在Drupal8里,你还想把一些全局的东西拿过来用。好吧,我们继续看一下Node模块,下面列出来前边提到的node.js文件:
/** * @file * Defines Javascript behaviors for the node module. */ (function ($) { // code ... })(jQuery);
这个闭包形式可能是大部分开发者经常用的,但是有些时候模块需要包含更多组件。core/misc/tableresponsive.js是这样完成闭包的:
(function ($, Drupal, window) { })(jQuery, Drupal, window);
你可能已经注意到了一些变化,Drupal.settings现在成了drupalSettings,这将允许开发者无需包含任何的Drupal命名空间就可以使用设置功能 。
参与
改变不止这些。还有许多工作要做,许多地方都需要其他的帮助。如果你想参与进来,这里列出了一些亟待解决的问题。