探寻Drupal8中的Javascript变化

龙马 提交于 周二, 09/03/2013 - 11:25

原文标题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命名空间就可以使用设置功能 。

参与

改变不止这些。还有许多工作要做,许多地方都需要其他的帮助。如果你想参与进来,这里列出了一些亟待解决的问题

博文分类