模块 - Modules
# module (模块)
>d 通过模块构建的脚本,如果引用了外部的js文件,需要在在VS编译器中定义**脚本在设备上的绝对路径**。否则调试时会提示找不到js文件,导致运行出错。
>w 飞云:
使用require最常遇到的问题,就是报错,提示找不到模块。
这是因为执行的方式不正确导致的。
正确的方法:
1、在vscode中,新建项目。
2、创建项目目录,将项目建立到该目录。目录下,会自动生成项目文件。
3、在项目的main.js中,编写业务代码
4、在项目目录下,可以放一些公共模块(js文件),在main.js中引用。
5、每次执行,要选择运行项目(autoX),或者运行(autojs 8),不要选择”执行单脚本文件“!这个很关键。
6、报错的原因,通常是引用的文件路径不正确导致的。
7、具体的引用方法,可以参考下面的例子
```js
//20230314 By 飞云
log('引用main.js同目录的公共模块common.js'');
// var common = require(engines.myEngine().cwd() + '/common.js'); //绝对路径
var common = require('common.js'); //相对路径
// log(common)
```
Auto.js 有一个简单的模块加载系统。
在 Auto.js 中,文件和模块是一一对应的(每个文件被视为一个独立的模块)。
例子,假设有一个名为 foo.js 的文件:
```js
var circle = require('circle.js');
console.log("半径为 4 的圆的面积是 %d", circle.area(4));
```
在第一行中,foo.js 加载了同一目录下的 circle.js 模块。
circle.js 文件的内容为:
```js
const PI = Math.PI;
var circle = {};
circle.area = function (r) {
return PI * r * r;
};
circle.circumference = (r) => 2 * PI * r;
module.exports = circle;
```
circle.js 模块导出了 area() 和 circumference() 两个函数。 通过在特殊的 exports 对象上指定额外的属性,函数和对象可以被添加到模块的根部。
模块内的本地变量是私有的。 在这个例子中,变量 PI 是 circle.js 私有的,不会影响到加载他的脚本的变量环境。
module.exports属性可以被赋予一个新的值(例如函数或对象)。
如下,bar.js 会用到 square 模块,square 导出一个构造函数:
```js
const square = require('square.js');
const mySquare = square(2);
console.log("正方形的面积是 %d", mySquare.area());
square 模块定义在 square.js 中:
// 赋值给 `exports` 不会修改模块,必须使用 `module.exports`
module.exports = function(width) {
return {
area: () => width ** 2
};
};
```