Skip to content

Commit

Permalink
upadte taki
Browse files Browse the repository at this point in the history
  • Loading branch information
egoist committed Jan 12, 2018
1 parent 1576ac2 commit fb82d08
Show file tree
Hide file tree
Showing 6 changed files with 292 additions and 934 deletions.
12 changes: 1 addition & 11 deletions README.md
Expand Up @@ -53,17 +53,7 @@ By default it only prerenders path: `/`, you can configure `routes` option for m

## Configure in package.json

#### Use Chrome headless

By default it uses JSDOM, but you can use Chrome instead:

```js
{
"presite": {
"browser": "chrome"
}
}
```
Note: You can also configuration it in `presite.json`.

#### Set routes that needs prerender

Expand Down
178 changes: 100 additions & 78 deletions bin/cli.js
@@ -1,8 +1,10 @@
#!/usr/bin/env node
const path = require('path')
const cac = require('cac')
const loudRejection = require('loud-rejection')
const chalk = require('chalk')
const update = require('update-notifier')
const UseConfig = require('use-config')
const pkg = require('../package')

update({ pkg }).notify()
Expand All @@ -12,98 +14,118 @@ loudRejection()
const cli = cac()

cli
.command('*', 'Prerender your website', (input, flags) => {
// eslint-disable-next-line import/order
const readPkg = require('read-pkg-up')
const Server = require('../lib/Server')
const Crawler = require('../lib/Crawler')
const Writer = require('../lib/Writer')
const Logger = require('../lib/Logger')

const cliOptions = pick(flags, [
'manually',
'routes',
'wait',
'outDir',
'verbose',
'browser'
])

if (input[0]) {
cliOptions.baseDir = input[0]
}
.command(
'*',
{
desc: 'Prerender your website',
examples: ['$ presite ./dist', '$ presite ./dist -o ./static-html']
},
(input, flags) => {
// eslint-disable-next-line import/order
const Server = require('../lib/Server')
const Crawler = require('../lib/Crawler')
const Writer = require('../lib/Writer')
const Logger = require('../lib/Logger')

const cliOptions = pick(flags, [
'manually',
'routes',
'wait',
'outDir',
'verbose',
'browser'
])

if (input[0]) {
cliOptions.baseDir = input[0]
}

let server
let options
let writer
let logger

const useConfig = new UseConfig({
name: 'presite',
files: ['package.json', '{name}.json']
})

let server
let options
let writer
let logger

readPkg()
.then(({ pkg: userPkg = {} }) => {
options = Object.assign(
{
outDir: '.presite',
routes: ['/']
},
userPkg.presite,
cliOptions
)

if (!options.baseDir) {
throw new Error('Please provide the path to your SPA!')
}

logger = new Logger({ verbose: !options.quiet })

server = new Server({
baseDir: options.baseDir
useConfig
.load()
.then(({ config, path: configPath }) => {
if (configPath) {
console.log(
`Using config from ${chalk.green(
path.relative(process.cwd(), configPath)
)}`
)
}
options = Object.assign(
{
outDir: '.presite',
routes: ['/']
},
config,
cliOptions
)

if (!options.baseDir) {
throw new Error('Please provide the path to your SPA!')
}

logger = new Logger({ verbose: !options.quiet })

server = new Server({
baseDir: options.baseDir
})

writer = new Writer({
outDir: options.outDir
})

return Promise.all([server.start(), writer.copyFrom(options.baseDir)])
})

writer = new Writer({
outDir: options.outDir
.then(() => {
const crawler = new Crawler({
hostname: server.hostname,
port: server.port,
options,
writer,
logger
})

return crawler.crawl()
})

return Promise.all([server.start(), writer.copyFrom(options.baseDir)])
})
.then(() => {
const crawler = new Crawler({
hostname: server.hostname,
port: server.port,
options,
writer,
logger
.then(() => {
server && server.stop()
logger.log(`Done, check out ${chalk.green(options.outDir)} folder`)
process.exit()
})

return crawler.crawl()
})
.then(() => {
server && server.stop()
logger.log(`Done, check out ${chalk.yellow(options.outDir)} folder`)
process.exit()
})
.catch(err => {
console.error(err.stack)
server && server.stop()
process.exit(1)
})
})
.option('browser', {
desc: 'Choose a browser, can be eithor "jsdom" (default) or "chrome"'
})
.catch(err => {
console.error(err.stack)
server && server.stop()
process.exit(1)
})
}
)
.option('wait', {
desc: 'Wait for specific ms or dom element to appear'
})
.option('manually', {
desc: 'Manually set ready state in your app'
desc: 'Manually set ready state in your app',
alias: 'm'
})
.option('routes', {
desc: 'An array of routes to crawl contents from'
desc: 'An array of routes to crawl contents from',
alias: 'r'
})
.option('out-dir', {
desc: 'The directory to output files'
desc: 'The directory to output files',
alias: ['o', 'd']
})
.option('quiet', {
desc: 'Output nothing in console'
desc: 'Output nothing in console',
alias: 'q'
})

cli.parse()
Expand Down
2 changes: 1 addition & 1 deletion circle.yml
Expand Up @@ -3,7 +3,7 @@ jobs:
build:
working_directory: ~/repo
docker:
- image: circleci/node:latest
- image: circleci/node:latest-browsers
branches:
ignore:
- gh-pages # list of branches to ignore
Expand Down
26 changes: 11 additions & 15 deletions lib/Crawler.js
Expand Up @@ -16,25 +16,21 @@ module.exports = class Crawler {
const routes = options.routes

const crawlRoute = routes => {
const url = routes.map(route => `http://${hostname}:${port}${route}`)
return taki(
Object.assign(
{
onStart: url => {
logger.log(`Crawling contents from ${chalk.cyan(url)}`)
}
},
options,
{
url
}
)
).then(result => {
const takiOptions = routes.map(route => ({
...options,
url: `http://${hostname}:${port}${route}`,
onFetch: url => {
logger.log(`Crawling contents from ${chalk.cyan(url)}`)
}
}))
return taki(takiOptions).then(result => {
return Promise.all(
routes.map((route, index) => {
route = handleRoute(route)
logger.log(
`Writing ${chalk.cyan(route)} for ${chalk.cyan(url[index])}`
`Writing ${chalk.cyan(route)} for ${chalk.cyan(
takiOptions[index].url
)}`
)
return writer.write({ html: result[index], route })
})
Expand Down

0 comments on commit fb82d08

Please sign in to comment.