Paperless Forest

Как переиспользовать код с помощью dataviewjs

#dataview #dataviewjs #Obsidian

Иногда код dataviewjs получается слишком большим, или один и тот же кусок кода нужно использовать несколько раз в разных местах. Поэтому хочется не писать его весь в заметке, а часть кода вынести в отдельный модуль.Теоретически это можно сделать при помощи стандартного метода require, но проблема в том, что он не работает на мобильном.

Раньше я использовала для этого плагин CustomJS, но теперь выяснила, как можно обойтись стандартным функционалом Dataview.

Для этого используется функция dv.view().

Сначала создаём файл с расширением .js, например, my_сode.js, и кладём его в любое место в своём хранилище Обсидиана. Для примера положим его в папку scripts. Пишем в нём весь код, который хотим переиспользовать. Например, напишем там следующий код:

dv.paragraph("Hello world!")

Затем в заметке в блоке dataviewjs пишем:

await dv.view("scripts/my_code")

При этом весь код, содержащийся в файле my_code.js автоматически исполняется и рендерится. Но что если мы не хотим ничего сразу рендерить, а хотим вернуть какие-то функции или переменные, которые можно использовать позже? Это можно сделать следующим образом.

В файле my_code.js пишем:

this.myFunc = (x) => {
	dv.paragraph(x)
}

this.myVar = "Hello world!"

И в заметке в блоке dataviewjs пишем:

await dv.view("scripts/my_code")

myFunc(myVar)

Подобным же образом можно переиспользовать любые функции или переменные.

Замечание: При таком способе все функции и переменные присваиваются глобальному объекту window, что не очень безопасно, потому что можно случайно перезаписать какие-то существующие свойства или методы. Кажется, что безопаснее было бы использовать промежуточный объект.

Например, в файле my_code.js пишем:

const myFunc = (x) => {
	dv.paragraph(x)
}

const myVar = "Hello world!"

this.myObject = {myFunc, myVar}

И в заметке в блоке dataviewjs пишем:

await dv.view("scripts/my_code")

const {myFunc, myVar} = myObject

myFunc(myVar)

У объекта myObject должно быть уникальное имя, не совпадающее ни с одним из свойств объекта window, но с одним объектом это легче проконтролировать, чем со множеством функций и переменных, которые мы можем использовать.

Можно также использовать класс вместо объекта. В файле my_code.js пишем:

this.myClass = class myClass {
	myFunc() {
		dv.paragraph("Hello world!")
	}
}

И в заметке в блоке dataviewjs пишем:

await dv.view("scripts/my_code")

const newClass = new myClass

newClass.myFunc()