1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-07-05 03:33:27 +00:00
TiddlyWiki5/editions/tw5.com/tiddlers/mechanisms/BootMechanism.tid

41 lines
2.7 KiB
Plaintext
Raw Normal View History

2012-08-04 10:20:47 +00:00
title: BootMechanism
tags: docs mechanism
2012-05-04 16:46:01 +00:00
!Introduction
TiddlyWiki5 is based on a 1,000 line boot kernel that runs on node.js or in the browser, with all other functionality added via dynamically loaded modules.
2012-05-04 16:46:01 +00:00
2012-08-04 10:20:47 +00:00
The kernel boots just enough of the TiddlyWiki environment to allow it to load tiddlers and execute JavaScript modules. Plugin modules are written like `node.js` modules.
2012-05-04 16:46:01 +00:00
2013-03-03 20:06:32 +00:00
There are many [[different types of module|ModuleType]]: parsers, deserializers, widgets etc. It goes much further than you might expect. For example, individual tiddler fields are modules, too: there's a module that knows how to handle the `tags` field, and another that knows how to handle the special behaviour of the `modified` and `created` fields.
2012-05-04 16:46:01 +00:00
2012-08-04 10:20:47 +00:00
Some plugin modules have further sub-plugins: the wikitext parser, for instance, accepts rules as individual plugin modules.
2012-05-04 16:46:01 +00:00
!Plugins and Modules
In TiddlyWiki5, [[Plugins]] are bundles of tiddlers that are distributed and managed as one; [[Modules]] are JavaScript tiddlers with a module type identifying when and how they should be executed.
2012-05-05 22:08:00 +00:00
The tiddler [[$:/boot/boot.js]] is a barebones TiddlyWiki kernel that is just sufficient to load the core plugin modules and trigger a startup module to load up the rest of the application.
2012-05-05 22:08:00 +00:00
The kernel includes:
* Several short shared utility functions
* A handful of methods implementing the plugin module mechanism
* The `$tw.Tiddler` class (and field definition plugins)
* The `$tw.Wiki` class (and tiddler deserialization methods)
2012-05-05 22:08:00 +00:00
* Code for the browser to load tiddlers from the HTML DOM
* Code for the server to load tiddlers from the file system
Each module is an ordinary `node.js`-style module, using the `require()` function to access other modules and the `exports` global to return JavaScript values. The boot kernel smooths over the differences between `node.js` and the browser, allowing the same plugin modules to execute in both environments.
In the browser, `core/boot.js` is packed into a template HTML file that contains the following elements in order:
* Ordinary and system tiddlers, packed as HTML `<DIV>` elements
2012-05-05 22:08:00 +00:00
* `core/bootprefix.js`, containing a few lines to set up the plugin environment
* JavaScript modules, packed as HTML `<SCRIPT>` blocks
2012-05-05 22:08:00 +00:00
* `core/boot.js`, containing the boot kernel
On the server, `core/boot.js` is executed directly. It uses the `node.js` local file API to load plugins directly from the file system in the `core/modules` directory. The code loading is performed synchronously for brevity (and because the system is in any case inherently blocked until plugins are loaded).
The boot kernel sets up the `$tw` global variable that is used to store all the state data of the system.