Приложение и поведение basis.js конфигурируется при подключении basis.js. Конфигурация задается в атрибуте basis-config или data-basis-config.
<script src="path/to/basisjs/src/basis.js" basis-config="
noConflict: true,
modules: {
app: {
autoload: true,
filename: 'src/app.js'
}
}
"></script>
Конфигурация – это обычный JavaScript объект, у которого опущены обрамляющие фигурные скобки. Поэтому поддерживаются любые конструкции, доступные в JavaScript.
Все опции являются необязательными и конфигурация может быть пустой строкой. В этом случае будут использоваться значения по умолчанию.
Конфигурация анализируется в момент инициализации ядра basis.js, и для известных опций нормализуются значения. Неизвестные опции остаются в исходном виде. Нормализованная конфигурация сохраняется в basis.config и может быть использована модулями и приложением.
С версии 1.3 появилась функция basis.processConfig, которая доступна только в режиме разработки. Она позволяет получить нормализованную конфигурацию из любого объекта. В частности, эта функция используется сборщиком basisjs-tools (с версии 1.3.12) для преобразования конфигурации при сборке (в сборку попадает нормализованная конфигурация).
Booleanfalse1.0По умолчанию корневые пространства имен при создании добавляются в глобальную область видимости. Это удобно при разработке. Но такое поведение не всегда является желаемым, так как может приводить к конфликтам имен, либо же из-за соображений безопасности. В случае, если требуется запретить добавление в глобальную область видимости, необходимо задать этой опции значение true.
Если noConflict: true, то корневые пространства имен становятся недоступны в глобальной области видимости. Поэтому единственный вариант инициализации приложения (первичного модуля) – использовать опцию autoload либо настройку autoload в описании модулей в опции modules. Любой модуль, подключаемый basis.js через basis.resource или basis.require (или их локальные версии в рамках модулей) имеет ссылку в своей области видимости на сам basis.js – basis. Имея такую ссылку, можно получить доступ к любому пространству имен (через basis.namespace) или модулю (через [basis.]require или [basis.]resource).
StringundefinedОпция позволяет указать, какой модуль нужно загрузить автоматически сразу после загрузки ядра. Позволяет сократить описание частой ситуации.
<!-- без autoload -->
<script src="path/to/basisjs/src/basis.js" basis-config=""></script>
<script>
basis.require('app');
</script>
<!-- эквивалент, используя autoload -->
<script src="path/to/basisjs/src/basis.js" basis-config="autoload: 'app'"></script>
В значении задается корневое пространство имен, которое нужно загрузить. Если в значении присутсвуют слеши (/), то все, что идет до последнего слеша, используется в качестве базового пути для корневого пространства имен.
<script src="path/to/basisjs/src/basis.js" basis-config="autoload: 'path/to/app'"></script>
<!-- эквивалентно -->
<script src="path/to/basisjs/src/basis.js" basis-config="autoload: 'app', path: { app: 'path/to/app' }"></script>
До версии 1.3 можно было указать только один модуль, который должен быть загружен автоматически. Начиная с версии 1.3, автозагружаемых модулей может быть произвольное количество. Необходимость в автоматической загрузки можно задать для любого модуля, указав autoload: true в описании модуля в секции modules.
Object1.3Позволяет задать пути для корневых пространств имен (библиотек). Значением опции является объект, где ключи – названия корневых пространств имен, а значение – базовый путь. Пути разрашаются относительно html страницы. Например:
<script src="path/to/basisjs/src/basis.js" basis-config="
path: {
foo: 'path/to/foo.js'
}
"></script>
<script>
console.log(basis.resolveNSFilename('foo'));
// > '/page/location/path/to/foo.js'
console.log(basis.resolveNSFilename('foo.bar'));
// > '/page/location/path/to/foo/bar.js'
</script>
Существует несколько правил для нормализации путей:
// если путь заканчивается на `/`, то в конце подставляется имя модуля
// path: {
// foo: 'path/to/'
// }
console.log(basis.resolveNSFilename('foo'));
// > '/page/location/path/to/foo.js'
console.log(basis.resolveNSFilename('foo.bar'));
// > '/page/location/path/to/foo/bar.js'
// если в конце нет расширения `.js`, оно подставляется
// path: {
// foo: 'path/to/foo'
// }
console.log(basis.resolveNSFilename('foo'));
// > '/page/location/path/to/foo.js'
console.log(basis.resolveNSFilename('foo.bar'));
// > '/page/location/path/to/foo/bar.js'
// имя в конце может не совпадать с именем модуля
// path: {
// foo: 'path/to/baz'
// }
console.log(basis.resolveNSFilename('foo'));
// > '/page/location/path/to/baz.js'
console.log(basis.resolveNSFilename('foo.bar'));
// > '/page/location/path/to/baz/bar.js'
Начиная с версии 1.3, опция считается устаревшей и будет удалена в будущих версиях. Вместо нее рекомендуется использовать modules, с помощью которой можно задать более развернутое описание библиотек (модулей). С версии 1.3, если используется path, то значение подмешивается к modules без перезаписи ключей, определенных в modules.
Object1.3Используется для описания библиотек (корневых модулей), их расположения и поведения. Значением опции является объект, где ключи – названия корневых пространств имен, а значение – объект-описание.
В описании модуля можно указать следующие опции:
autoload – автоматически загружать модуль после инициализации ядра;filename – путь к корневому файлу библиотеки (модуля);path – базовый путь для вложенных модулей библиотеки (модуля).Все опции являются не обязательными. В качестве описания может быть задана строка, в этом случае она считается значением опции filename.
<script src="path/to/basisjs/src/basis.js" basis-config="
modules: {
foo: 'path/to/foo.js'
}
"></script>
<!-- эквивалентно -->
<script src="path/to/basisjs/src/basis.js" basis-config="
modules: {
foo: {
filename: 'path/to/foo.js'
}
}
"></script>
От того, заданы одновременно обе опции filename и path или только одна из них, зависит сценарий разрешения путей. Но в результате будут получены значения для обеих опций:
path разрешается относительно пути страницы, а filename относительно полученного path; при этом для path используется basis.path.dirname(filename);filename, то повторяется поведение устаревшей опции path (по этой причине для перехода на использование modules вместо path достаточно изменить имя опции);path, то сначала повторяется логика для filename, а для базового имени используется basis.path.dirname(filename).// modules: {
// foo: {
// path: 'path/to/',
// filename: 'index.js'
// }
// }
console.log(basis.config.modules.foo);
// > {
// path: '/page/location/path/to',
// filename: '/page/location/path/to/index.js'
// }
console.log(basis.resolveNSFilename('foo'));
// > '/page/location/path/to/index.js'
console.log(basis.resolveNSFilename('foo.bar'));
// > '/page/location/path/to/bar.js'
// modules: {
// foo: {
// filename: 'path/to/index.js'
// }
// }
console.log(basis.config.modules.foo);
// > {
// path: '/page/location/path/to/index',
// filename: '/page/location/path/to/index.js'
// }
console.log(basis.resolveNSFilename('foo'));
// > '/page/location/path/to/index.js'
console.log(basis.resolveNSFilename('foo.bar'));
// > '/page/location/path/to/index/bar.js'
// modules: {
// foo: {
// path: 'path/to/index.js'
// }
// }
console.log(basis.config.modules.foo);
// > {
// path: '/page/location/path/to',
// filename: '/page/location/path/to/index.js'
// }
console.log(basis.resolveNSFilename('foo'));
// > '/page/location/path/to/index.js'
console.log(basis.resolveNSFilename('foo.bar'));
// > '/page/location/path/to/bar.js'
// слеш (`/`) в конце значения для `path` игнорируется
// modules: {
// foo: {
// path: 'path/to/'
// }
// }
console.log(basis.config.modules.foo);
// > {
// path: '/page/location/path/to',
// filename: '/page/location/path/to.js'
// }
console.log(basis.resolveNSFilename('foo'));
// > '/page/location/path/to.js'
console.log(basis.resolveNSFilename('foo.bar'));
// > '/page/location/path/to/bar.js'
true, false или 'warn'1.4 – true1.5 – 'warn'1.6 – false1.41.7 с сохранением поведения для значения falseИсторически basis.js неявно расширяет пространства имен, дополняя их свойствами, ссылающимися на вложенные пространства имен, и свойствами из exports модуля. Таким образом появляется возможность использовать вложенные пространства имен и значения из exports без явного объявления. С одной стороны, это удобно, но, с другой стороны, приводит к путанице и конфликтам (например, если название вложенного пространства имен совпадает со значением из exports). К тому же это усложняет статический анализ при сборке, так как теряются явные связи между модулями. Подробнее о проблеме можно прочитать в документе про отказ от пространств имен в их изначальном виде.
Данная опция позволяет управлять неявным расширением. Поведение зависит от значения опции:
true – осуществлять неявное расширение (исторически сложившееся поведение);'warn' – осуществлять неявное расширение, но выводить предупреждение при обращении к неявно заданным свойствам (полезно при миграции);false – не делать неявного расширения (планируемое поведение с версии 1.6).При implicitExt: true следующий пример является валидным:
// basis.config.implicitExt = true
basis.require('basis.ui');
var view = new basis.ui.Node();
Если значение implicitExt равно 'warn', то в консоли будет выведено два предупреждения.
// basis.config.implicitExt = 'warn'
basis.require('basis.ui');
var view = new basis.ui.Node();
// > basis.js: Access to implicit namespace `basis.ui`
// > basis.js: Access to implicit namespace property `basis.ui.Node`
В случае, если значение implicitExt равно false, будет сгенерировано исключение, так как basis.ui не будет объявлено (как и Node в пространстве имен basis.ui).
// basis.config.implicitExt = false
basis.require('basis.ui');
console.log('ui' in basis);
// > false
console.log('Node' in basis.namespace('basis.ui'))
// > false
Опция необходима на переходный период и будет удалена в версии 1.7 с сохранением поведения для значения false.
true, false или 'warn'1.2 – 'warn'1.2 – false1.01.3Сообщает basis.js, нужно ли дополнять прототипы встроенных классов дополнительными методами. Поведение зависит от значения:
true – расширять прототипы;'warn' – расширять прототипы, но выводить предупреждение при использовании таких методов;false – не расширять прототипы.Опция была нужна на переходный период отказа от расширений прототипов стандартных классов. Начиная с версии 1.3, прототипы не расширяются, и нет возможности управлять этим.
Boolean1.0Сообщает basis.js, нужно ли дополнять встроенные классы статическими методами. Поведение зависит от значения:
false – не менять классы;true – дополнять классы статическими методами.Опция была нужна на переходный период отказа от функций, прикрепленных к стандартным классам. Начиная с версии 1.0, классы не расширяются, и нет возможности управлять этим.