blob: 8c160ce30ac147ef440acccb9328e04962d70031 [file] [view]
# web/
Common html/css/js files shared by all apps live here, as well as a scripts
to "build" web applications.
## Setup
1. Install node & npm: https://docs.npmjs.com/getting-started/installing-node
1. Install the rest: `./web.py install`
## Building apps
All supported web apps are in `web/apps/`. The snippet below uses rpcexplorer
as an example.
```shell
cd web
./web.py gulp rpcexplorer clean # this is optional
./web.py build rpcexplorer
ls -R dist/rpcexplorer # the built app is here
```
`dist/rpcexplorer` then can be deployed as is to a server.
## Layout
### Applications (apps/)
Web applications are defined as subdirectories in the `apps/` directory. Each
subdirectory contains an application root which, in turn, contains the composite
application files.
The layout of the `apps/` directory is hard-coded into the Gulp build script
located at `apps/gulp-common.js`.
The application layout looks like:
`apps/myapp/...`
* `gulpfile.js` is the application's Gulpfile. It performs minimal application-
specific tailoring of the common Gulp environment and then calls through to
`apps/gulp-common.js`.
* `inc` is a symlink to `web/inc` directory so that common code can be
referenced within the app root.
* `index.html` is the application's main entry point.
* `elements/elements.html` contains the set of import links for vulcanization.
* `scripts-ts/*.ts` is the set of application TypeScript code, and will be
automatically trans-compiled to JavaScript if defined.
### Includes (inc/)
The "inc/" directory contains shared web resources:
- Local resources are LUCI-specific web resources that belong to this
repository. They are located in immediate subdirectories of `inc`.
- Bower-imported resources are defined in `bower.json`, and are located in the
`inc/bower_components` directory.
Web apps that want to use these shared resources can do so by symlinking the
`inc` directory into their application subdirectory (`web/apps/<app>/inc`).
#### TypeScript
The `inc/tsconfig.json` file in this directory is the common TypeScript
configuration file for the TypeScript files in this directory.
TypeScript is compiled by the 'ts' build target in `apps/gulp-common.js`. The
compiled JavaScript is merged into a single output file, `main.js`, along with
an associated map file, `main.js.map`. These generated files are not checked in,
and are ignored via ".gitignore".
Local LUCI TypeScript in the `inc/` directory is composed of a series of
internal relative references. Each referenced TypeScript file will export its
contents as `namespace`s. We do this to avoid unnecessary module imports:
```TypeScript
////////////////////////////////////////////////////////////////////////////////
// inc/component/importer.ts
////////////////////////////////////////////////////////////////////////////////
///<reference path="../relpath/file.ts" />
MyThing.doSomething();
////////////////////////////////////////////////////////////////////////////////
// inc/relpath/file.ts
////////////////////////////////////////////////////////////////////////////////
namespace MyThing {
function doSomething() { ... }
}
```
An application that wants to use this TypeScript can do so by creating a
`scripts-ts` subdirectory in its application folder. Any TypeScript in this
subdirectory will be automatically compiled into `main.js` at build time and can
then be included in the application.
Minimally, an application should reference the `inc/` packages that it cares
about to pull them in. This can be done with a simple reference (remember that
`inc` is symlinked from the application's root):
```TypeScript
////////////////////////////////////////////////////////////////////////////////
// apps/myapp/scripts-ts/main.ts
////////////////////////////////////////////////////////////////////////////////
///<reference path="../inc/component/importer.ts" />
```
This will cause Gulp to build a `main.js` file containing the correctly-ordered
chain of referenced components ready for inclusion.
If an application chooses to import external modules, those imports will require
a module loader such as [require.js](http://requirejs.org/) to be installed in
the application.