1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wm123450405-aspects-js

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.ZH-CN.md 6.6 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 15.03.2025 16:30 ab694e2

аспекты-js

аспекты-js

English

Использование аспектно-倾诉编程在NodeJS中

1. Установка

Установите с помощью NPM

$ npm install --save aspects-js

2. Использование

Необходимо импортировать aspects-js в вашем входном файле

require('aspects-js');

3. Добавление аспекта

Добавьте аспект, определение которого будет записано в новом файле. Сначала, импортируйте Aspect интерфейс из aspects-js в начале файла с определением аспекта

// Файл: testAspect.js
const { Aspect } = require('aspects-js');

Затем, объявите пользовательский класс аспекта, который наследует Aspect интерфейс, перезаписывая метод get pointcut, чтобы вернуть выражение аспекта, а также можно переопределить некоторые методы для обработки соединительных точек

// Файл: testAspect.js
class TestAspect extends Aspect {
    get pointcut() { return '*.do*()' };
    before() { console.log('this is for before join point') };
    after() { console.log('this is for after join point') }
}

После этого экспортируйте экземпляр данного пользовательского класса аспекта

// Файл: testAspect.js
module.exports = new TestAspect();

Наконец, загрузите указанный экземпляр класса аспекта в проектном входном файле (перед тем, как его потребуется загрузить)

// Файл: entry.js
require('./testAspect.js');

Теперь все последующие загружаемые классы будут обрабатываться пользовательским классом аспекта при выполнении их методов.

4. API (предоставленные интерфейсы/классы)

Интерфейс Aspect

interface Aspect {
    readonly pointcut: Pointcut | string | ((joinPoint: JoinPoint) => boolean);
    readonly order: number;

    after(joinPoint: JoinPoint, result: any, error: Error);
    afterReturn(joinPoint: JoinPoint, result: any): any;
    afterThrow(joinPoint: JoinPoint, error: Error): void;
    before(joinPoint: JoinPoint): void;
    around(joinPoint: JoinPoint): any;
}

Класс JoinPoint

class JoinPoint {
    readonly type: Class;
    readonly fun: Function;
    readonly thisArg: any;
    readonly target: any;
    readonly args: any[];

    proceed(...args: any[]): any;
}

Класс Pointcut

class Pointcut {
    constructor(pointcut: string);
}    matches(join_point: JoinPoint): boolean;
 }
 ```## 5. Аспектные выражения
 ### 1. Стандартное выражение
 ```javascript
 "ClassName.FunctionName()"

2. Ключевое слово execution

"execution(ClassName.FunctionName())"

3. Ключевое слово within

"within(ClassName)"

4. Выражение с параметрами

"FunctionName(. .)"
"FunctionName(Type1, Type2)"
"FunctionName(Type1, . ., Type2)"
#### > `*` сопоставляет несколько символов *`шаблон`*
```javascript
"*Service.do*()"

Соответствует всем методам, начинающимся с do в типах, заканчивающихся на Service.

> ? сопоставляет один символ шаблон

"you?.do?()"

> + логический оператор "или" для названий

"within(Test1 + Test2)"

Соответствует всем методам в Test1 или Test2.

> |, || логический оператор "или"

"within(Test1) | within(Test2)"

Соответствует всем методам в Test1 или Test2.

> &, && логический оператор "и"

"within(Test1) & abc"

Соответствует методу abc в Test1.

> ! логический оператор "не"

"! within(Test)"

Соответствует всем методам, кроме тех, что находятся в классе Test.

> () оператор скобок (логическое группирование)

Увеличивает приоритет выражений внутри скобок.

> () оператор вызова метода

"abc()"
"abc(. .)"

Соответствует всем методам, названным abc.

"abc(Type1)"

Соответствует всем методам, названным abc, где передается один аргумент типа Type1.

> , оператор разделения аргументов

"*(Type1, Type2)"
```Соответствует всем методам, где передаются два аргумента типа `Type1` и `Type2` соответственно.
#### > `. ` оператор свойства
```javascript
"Test.abc()"

Соответствует методу abc в классе Test.

> . . Оператор нескольких аргументов

Соответствует нескольким последовательным аргументам.### 5. Другое

Атрибут order интерфейса Aspects

Этот атрибут используется для управления порядком выполнения аспектов; чем меньше значение, тем выше приоритет.

6. Обновления и выпуски

1.0.2 Незапланированный выпуск

Добавлены pointcuts, которые могут использовать функции как значения. К интерфейсу Aspects добавлен атрибут order для управления порядком выполнения аспектов.

1.0.1

Используется AST вместо регулярных выражений в pointcuts.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wm123450405-aspects-js.git
git@api.gitlife.ru:oschina-mirror/wm123450405-aspects-js.git
oschina-mirror
wm123450405-aspects-js
wm123450405-aspects-js
master