docs: 支持 API 列表的 SEO
This commit is contained in:
parent
678d02b418
commit
cf3c92e317
|
@ -88,6 +88,7 @@
|
||||||
"classlist.js": "^1.1.20150312",
|
"classlist.js": "^1.1.20150312",
|
||||||
"core-js": "^2.4.1",
|
"core-js": "^2.4.1",
|
||||||
"jasmine": "^2.6.0",
|
"jasmine": "^2.6.0",
|
||||||
|
"klaw-sync": "^5.0.0",
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"ng-pwa-tools": "^0.0.10",
|
"ng-pwa-tools": "^0.0.10",
|
||||||
"rxjs": "6.0.0-uncanny-rc.7",
|
"rxjs": "6.0.0-uncanny-rc.7",
|
||||||
|
|
|
@ -1,33 +1,55 @@
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as mkdirp from 'mkdirp';
|
import * as mkdirp from 'mkdirp';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
import * as klawSync from 'klaw-sync';
|
||||||
|
|
||||||
|
const rootElementPattern = /<aio-shell\b[\s\S]*<\/aio-shell>/;
|
||||||
|
|
||||||
function buildInnerPages(): void {
|
|
||||||
const navigation = fs.readFileSync('./content/navigation.json', 'utf-8');
|
|
||||||
const indexTemplate = fs.readFileSync('./dist/index.html', 'utf-8');
|
const indexTemplate = fs.readFileSync('./dist/index.html', 'utf-8');
|
||||||
const aioShellTemplate = fs.readFileSync(__dirname + '/../assets/aio-shell-template.html');
|
const aioShellTemplate = fs.readFileSync(__dirname + '/../assets/aio-shell-template.html');
|
||||||
const pageTemplate = indexTemplate.replace('<aio-shell></aio-shell>', `${aioShellTemplate}`);
|
const pageTemplate = indexTemplate.replace(rootElementPattern, `${aioShellTemplate}`);
|
||||||
const urls = navigation.match(/"url": "(.*?)"/g)
|
|
||||||
.map((entry) => entry.replace(/^"url": "(.*?)".*$/, '$1'))
|
|
||||||
.filter(url => url.slice(0, 4) !== 'http')
|
|
||||||
.forEach(url => {
|
|
||||||
const generated: { title: string, contents: string } = JSON.parse(fs.readFileSync(`./dist/generated/docs/${url}.json`, 'utf-8'));
|
|
||||||
|
|
||||||
const content = generated.contents.replace(/href="(?!http)(.{2,}?)"/gi, 'href="/$1"');
|
function composePage(url) {
|
||||||
|
const { title, contents } = JSON.parse(fs.readFileSync(`./dist/generated/docs/${url}.json`, 'utf-8'));
|
||||||
|
|
||||||
|
if (!contents) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const ssrContent = contents.replace(/href="(?!http)(.{2,}?)"/gi, 'href="/$1"');
|
||||||
const pageContent = pageTemplate
|
const pageContent = pageTemplate
|
||||||
.replace('<title>Angular Docs</title>', `<title>${generated.title} - Angular 官方文档</title>`)
|
.replace('<title>Angular Docs</title>', `<title>${title} - Angular 官方文档</title>`)
|
||||||
.replace('<aio-page-content-placeholder></aio-page-content-placeholder>', content);
|
.replace('<aio-page-content-placeholder></aio-page-content-placeholder>', ssrContent);
|
||||||
mkdirp.sync(path.dirname(`./dist/${url}`));
|
mkdirp.sync(path.dirname(`./dist/${url}`));
|
||||||
fs.writeFileSync(`./dist/${url}.html`, pageContent, 'utf-8');
|
fs.writeFileSync(`./dist/${url}.html`, pageContent, 'utf-8');
|
||||||
});
|
}
|
||||||
|
|
||||||
|
function buildGuidePages(): void {
|
||||||
|
const navigation = fs.readFileSync('./content/navigation.json', 'utf-8');
|
||||||
|
navigation.match(/"url": "(.*?)"/g)
|
||||||
|
.map((entry) => entry.replace(/^"url": "(.*?)".*$/, '$1'))
|
||||||
|
.filter(url => url.slice(0, 4) !== 'http')
|
||||||
|
.forEach(url => composePage(url));
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildApiPages(): void {
|
||||||
|
const apiList = klawSync('./dist/generated/docs/api', { nodir: true })
|
||||||
|
.map(file => file.path.replace(/^.*generated\/docs(\/.*).json$/, '$1'));
|
||||||
|
apiList.forEach(url => composePage(url));
|
||||||
|
|
||||||
|
const links = apiList.map(url => `<a href="${url}">${url}</a>`).join('\n');
|
||||||
|
const apiListContent = fs.readFileSync('./dist/api.html', 'utf-8')
|
||||||
|
.replace(rootElementPattern, `<aio-shell><h3>API List</h3>${links}</aio-shell>`);
|
||||||
|
|
||||||
|
fs.writeFileSync(`./dist/api.html`, apiListContent, 'utf-8');
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildIndexPage(): void {
|
function buildIndexPage(): void {
|
||||||
const indexTemplate = fs.readFileSync('./dist/index.html', 'utf-8');
|
const indexTemplate = fs.readFileSync('./dist/index.html', 'utf-8');
|
||||||
const aioShellIndex = fs.readFileSync(__dirname + '/../assets/aio-shell-index.html');
|
const aioShellIndex = fs.readFileSync(__dirname + '/../assets/aio-shell-index.html');
|
||||||
const content = indexTemplate.replace('<aio-shell></aio-shell>', `${aioShellIndex}`);
|
const content = indexTemplate.replace(rootElementPattern, `${aioShellIndex}`);
|
||||||
fs.writeFileSync(`./dist/index.html`, content, 'utf-8');
|
fs.writeFileSync(`./dist/index.html`, content, 'utf-8');
|
||||||
}
|
}
|
||||||
|
|
||||||
buildInnerPages();
|
buildGuidePages();
|
||||||
|
buildApiPages();
|
||||||
buildIndexPage();
|
buildIndexPage();
|
||||||
|
|
|
@ -6245,6 +6245,12 @@ kind-of@^6.0.0, kind-of@^6.0.2:
|
||||||
version "6.0.2"
|
version "6.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
|
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
|
||||||
|
|
||||||
|
klaw-sync@^5.0.0:
|
||||||
|
version "5.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-5.0.0.tgz#b8db1249f96a82751c311ee8a626a319db119904"
|
||||||
|
dependencies:
|
||||||
|
graceful-fs "^4.1.11"
|
||||||
|
|
||||||
klaw@^1.0.0:
|
klaw@^1.0.0:
|
||||||
version "1.3.1"
|
version "1.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
|
resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
|
||||||
|
@ -6974,13 +6980,7 @@ mkdirp-promise@^5.0.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
mkdirp "*"
|
mkdirp "*"
|
||||||
|
|
||||||
mkdirp@*, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@~0.5.0:
|
mkdirp@*, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
|
||||||
version "0.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
|
||||||
dependencies:
|
|
||||||
minimist "0.0.8"
|
|
||||||
|
|
||||||
mkdirp@^0.5.1:
|
|
||||||
version "0.5.1"
|
version "0.5.1"
|
||||||
resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
Loading…
Reference in New Issue