lighthouse/readme.md

136 строки
4.7 KiB
Markdown
Исходник Обычный вид История

2016-03-08 00:52:24 +03:00
# lighthouse
2016-04-04 23:51:15 +03:00
> Stops you crashing into the rocks; lights the way
2016-03-08 00:52:24 +03:00
2016-03-19 22:15:22 +03:00
<p align="center">
<img src="https://cloud.githubusercontent.com/assets/883126/13900813/10a62a14-edcc-11e5-8ad3-f927a592eeb0.png" height="300px">
</p>
2016-03-16 03:57:46 +03:00
[![Build Status](https://travis-ci.org/GoogleChrome/lighthouse.svg?branch=master)](https://travis-ci.org/GoogleChrome/lighthouse)
2016-04-04 23:51:15 +03:00
_status: early. sorta working_
2016-03-08 00:52:24 +03:00
2016-04-14 11:01:51 +03:00
## Install
2016-03-08 00:52:24 +03:00
```sh
npm install -g GoogleChrome/lighthouse
2016-04-14 11:01:51 +03:00
```
2016-03-13 03:42:33 +03:00
2016-04-14 11:01:51 +03:00
## Run
```sh
2016-03-28 22:11:50 +03:00
# Start Chrome with a few flags
2016-03-29 03:33:32 +03:00
npm run chrome
2016-03-28 22:11:50 +03:00
2016-03-22 21:40:31 +03:00
# Kick off a lighthouse run
lighthouse https://airhorner.com/
# see flags and options
lighthouse --help
2016-03-08 00:52:24 +03:00
```
2016-04-14 11:01:51 +03:00
## Develop
#### Setup
```sh
git clone https://github.com/GoogleChrome/lighthouse
cd lighthouse
npm install
npm link
```
## Tests
2016-03-08 00:52:24 +03:00
2016-03-22 21:40:31 +03:00
Some basic unit tests forked are in `/test` and run via mocha. eslint is also checked for style violations.
2016-03-08 00:52:24 +03:00
```js
2016-03-29 00:01:54 +03:00
# lint and test all files
2016-03-29 03:33:32 +03:00
npm test
2016-03-29 00:01:54 +03:00
# watch for file changes and run tests
# Requires http://entrproject.org : brew install entr
npm run watch
2016-03-29 00:01:54 +03:00
## run linting and unit tests seprately
npm run lint
npm run unit
```
2016-03-08 00:52:24 +03:00
## Chrome Extension
The same audits are run against from a Chrome extension. See [./extension](https://github.com/GoogleChrome/lighthouse/tree/master/extension).
2016-03-31 02:17:41 +03:00
## Architecture
_Some incomplete notes_
2016-03-31 02:17:41 +03:00
#### Components
* **Driver** - Interfaces with Chrome Debugging Protocol
* **Gathers** - Requesting data from the browser (and maybe post-processing)
* **Artifacts** - The output of gatherers
* **Audits** - Non-performance evaluations of capabilities and issues. Includes a raw value and score of that value.
* **Metrics** - Performance metrics summarizing the UX
* **Diagnoses** - The perf problems that affect those metrics
* **Aggregators** - Pulling audit results, grouping into user-facing components (eg. `install_to_homescreen`) and applying weighting and overall scoring.
2016-04-08 20:46:08 +03:00
### Protocol
* _Interacting with Chrome:_ The Chrome protocol connection maintained via [chrome-remote-interface](https://github.com/cyrus-and/chrome-remote-interface) for the CLI and [`chrome.debuggger` API](https://developer.chrome.com/extensions/debugger) when in the Chrome extension.
2016-04-08 20:46:08 +03:00
* _Event binding & domains_: Some domains must be `enable()`d so they issue events. Once enabled, they flush any events that represent state. As such, network events will only issue after the domain is enabled. All the protocol agents resolve their `Domain.enable()` callback _after_ they have flushed any pending events. See example:
```js
// will NOT work
driver.sendCommand('Security.enable').then(_ => {
driver.on('Security.securityStateChanged', state => { /* ... */ });
})
// WILL work! happy happy. :)
driver.on('Security.securityStateChanged', state => { /* ... */ }); // event binding is synchronous
driver.sendCommand('Security.enable');
```
2016-04-20 20:47:14 +03:00
* _Debugging the protocol_: Read [Better debugging of the Protocol](https://github.com/GoogleChrome/lighthouse/issues/184).
2016-04-08 20:46:08 +03:00
2016-03-31 02:17:41 +03:00
### Gatherers
* _Reading the DOM:_ We prefer reading the DOM right from the browser (See #77). The driver exposes a `querySelector` method that can be used along with a `getAttribute` method to read values.
2016-03-31 02:17:41 +03:00
### Audits
The return value of each audit takes this shape:
```js
Promise.resolve({
name: 'audit-name',
tags: ['what have you'],
description: 'whatnot',
// value: The score. Typically a boolean, but can be number 0-100
value: 0,
// rawValue: Could be anything, as long as it can easily be stringified and displayed,
// e.g. 'your score is bad because you wrote ${rawValue}'
rawValue: {},
// debugString: Some *specific* error string for helping the user figure out why they failed here.
// The reporter can handle *general* feedback on how to fix, e.g. links to the docs
debugString: 'Your manifest 404ed'
// fault: Optional argument when the audit doesn't cover whatever it is you're doing,
// e.g. we can't parse your particular corner case out of a trace yet.
// Whatever is in `rawValue` and `score` would be N/A in these cases
fault: 'some reason the audit has failed you, Anakin'
});
```
2016-03-31 02:17:41 +03:00
## Code Style
2016-03-22 21:40:31 +03:00
The `.eslintrc` defines all.
2016-03-29 00:01:54 +03:00
#### Code documentation
We're using [JSDoc](http://usejsdoc.org/) along with [closure annotations](https://developers.google.com/closure/compiler/docs/js-for-compiler). Annotations encouraged for all contributions.
2016-03-22 21:40:31 +03:00
#### Variable declarations
`const` > `let` > `var`. Use `const` wherever possible. Save `var` for emergencies only.
## Trace processing
2016-03-08 00:52:24 +03:00
2016-03-22 21:40:31 +03:00
The traceviewer-based trace processor from [node-big-rig](https://github.com/GoogleChrome/node-big-rig/tree/master/lib) was forked into Lighthouse. Additionally, the [DevTools' Timeline Model](https://github.com/paulirish/devtools-timeline-model) is available as well. There may be advantages for using one model over another.