模块

这意味着:

  • 模块文件具有隐式的局部作用域。用var声明的变量永远不会是全局变量。 应该避免全局变量的使用。
  • 有三个预定义的局部变量:require、module 和 exports。这些变量允许你从/向其他模块导入/导出数据。
    当应用程序启动时,它会加载项目的中main字段定义的入口模块。例如::

入口模块通常会导入应用程序的其他模块,这些模块又可能导入另外的模块。

局部的require函数用于加载和导入另一个模块。它接受模块标识符字符串作为参数,并返回该模块导出的任何内容。最常见的是,标识符字符串是相对于当前脚本文件的模块(没有文件扩展名)的路径。

模块可以是.js文件、.json文件或者文件夹。require函数会按照这个顺序查找这些类型的模块。因此要导入与当前脚本同文件夹下的mymodule.js,可以这样写:

  1. const myModule = require('./mymodule');

模块也可能位于不同的文件夹中:

  1. const module1 = require('./subfolder/module1');

无论导入多少次,每个模块只会加载一次。 因此:

模块应导出函数、类或其他数据来供其他模块使用的。不应该使用全局JavaScript作用域来导出这些数据。实际上,你实现模块时,应该忽略全局作用域的存在。

由于每个模块只加载一次,无论导入多少次,模块的加载不应有任何副作用。特别地,模块不应该在加载时改变app的状态(例如通过向UI添加控件来改变app状态),而是导出执行此操作的函数。但很显然,入口模块是个例外。

任何JavaScript文件都是一个模块,可以由其他模块导入。默认情况下,模块的出口是一个普通的空对象。该对象在模块脚本中是一个名为exports的局部变量。模块可以添加任何字段到exports对象,例如:

  1. exports.circumference = (r) => 2 * 3.1416 * r;

要导出另一个对象(或任何其他类型的数据),可以通过为module.exports赋值来覆盖exports对象。 例如:

  1. module.exports = class Circle {

导入此模块的require函数会返回此类:

入口模块不能导出任何有用的东西。入口模块中是存在moduleexports对象的,但会被忽略。

  1. {"foo":1,"bar":2}

在另一个模块中导入该.json文件:

  1. console.log(data.foo === 1);

如果文件夹包含以下文件之一,则可将该文件夹作为模块来使用:

  • 一个用main字段指向一个入口.js 或 .json文件的package.json。
  • 一个index.js
  • 一个index.json
    文件夹模块可能包含多个内部文件模块,但只能从上述列表中找到的第一个文件导出。

Tabris.js支持加载npm 模块,但模块的兼容性取决于它所需的API。

使用将任何Tabris.js兼容的模块安装到项目文件夹中。

要加载本地安装的npm模块,直接使用其名称作为标识符字符串,不带开头的点号。例如:

已经使用Tabris.js测试的模块被标记为GitHub issues。如果确认模块有效,问题会被关闭。请随时将你测试过的模块添加到issues。