From d384b8519a9e3569495af70213fc2ebd4c9599dc Mon Sep 17 00:00:00 2001 From: gaoliang Date: Sun, 21 Jul 2019 19:30:16 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8=20express=20?= =?UTF-8?q?=E4=BD=9C=E4=B8=BA=E6=9C=AC=E5=9C=B0=E9=9D=99=E6=80=81=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=EF=BC=8C=E7=AE=80=E5=8C=96=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + src/background.ts | 2 ++ src/components/Main.vue | 2 +- src/helpers/content-helper.ts | 4 +-- src/server.ts | 7 +++++ src/server/renderer.ts | 47 ++++++++++++++++---------------- yarn.lock | 50 +++++++++++++++++++++++++++++++++++ 7 files changed, 86 insertions(+), 27 deletions(-) create mode 100644 src/server.ts diff --git a/package.json b/package.json index b9bcb1d9..39c9c82f 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ }, "dependencies": { "@iktakahiro/markdown-it-katex": "^3.1.0", + "@types/express": "^4.17.0", "ant-design-vue": "^1.3.5", "axios": "^0.18.1", "bluebird": "^3.5.3", diff --git a/src/background.ts b/src/background.ts index 63070abd..ae879949 100644 --- a/src/background.ts +++ b/src/background.ts @@ -8,6 +8,7 @@ import { } from 'vue-cli-plugin-electron-builder/lib' import App from './server/app' import messages from './assets/locales-menu' +import createServer from './server' const isDevelopment = process.env.NODE_ENV !== 'production' @@ -109,6 +110,7 @@ function createWindow() { // Init app const appInstance = new App(setting) console.log('Main process runing...', appInstance.appDir) // DELETE ME + createServer(`${appInstance.appDir}/output`) } // Quit when all windows are closed. diff --git a/src/components/Main.vue b/src/components/Main.vue index 861c20a8..2fcc7f6c 100644 --- a/src/components/Main.vue +++ b/src/components/Main.vue @@ -129,7 +129,7 @@ export default class App extends Vue { ipcRenderer.send('html-render') ipcRenderer.once('html-rendered', (event: Event, result: any) => { this.$message.success(`🎉 ${this.$t('renderSuccess')}`) - this.openInBrowser(`file://${this.site.appDir}/output/index.html`) + this.openInBrowser('http://localhost:9999') }) } diff --git a/src/helpers/content-helper.ts b/src/helpers/content-helper.ts index 641f0004..ec374131 100644 --- a/src/helpers/content-helper.ts +++ b/src/helpers/content-helper.ts @@ -44,8 +44,8 @@ export default class ContentHelper { /** * 将 feature 本地图片路径,变更为线上路径 */ - changeFeatureImageUrlLocalToDomain(content: string, domainPath: string, mode: string) { - let url = content.replace(this.featureLocalReg, `${mode === 'preview' ? 'file:///' : ''}${domainPath}/post-images/`) + changeFeatureImageUrlLocalToDomain(content: string, domainPath: string) { + let url = content.replace(this.featureLocalReg, `${domainPath}/post-images/`) url = url.replace(/\\/g, '/') return url } diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 00000000..915ff2d5 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,7 @@ +import express from 'express' + +export default function createServer(SitePath: string) { + const server = express() + server.use(express.static(SitePath)) + server.listen(9999, () => console.log('Express listening on port 9999')) +} diff --git a/src/server/renderer.ts b/src/server/renderer.ts index 1e298775..dca43f9a 100644 --- a/src/server/renderer.ts +++ b/src/server/renderer.ts @@ -60,14 +60,14 @@ export default class Renderer extends Model { } async preview() { - this.db.themeConfig.domain = this.outputDir - await this.renderAll('preview') + this.db.themeConfig.domain = 'http://localhost:9999' + await this.renderAll() } async publish() { this.db.themeConfig.domain = this.db.setting.domain console.log('domain', this.db.themeConfig.domain) - await this.renderAll('publish') + await this.renderAll() console.log('渲染完毕') let result = { success: true, @@ -219,20 +219,20 @@ export default class Renderer extends Model { } - async renderAll(mode: string) { + async renderAll() { await this.clearOutputFolder() - await this.formatDataForRender(mode) + await this.formatDataForRender() await this.buildCss() // Render post list page - await this.renderPostList('', mode) + await this.renderPostList('') // Render archives page - await this.renderPostList('/archives', mode) + await this.renderPostList('/archives') // Render tag list page await this.renderTags() await this.renderPostDetail() - await this.renderTagDetail(mode) + await this.renderTagDetail() await this.copyFiles() await this.buildCname() @@ -252,7 +252,7 @@ export default class Renderer extends Model { /** * Format data for rendering pages */ - public formatDataForRender(mode: string): any { + public formatDataForRender(): any { const { themeConfig } = this.db this.postsData = this.db.posts.filter((item: IPostDb) => item.data.published) @@ -272,13 +272,13 @@ export default class Renderer extends Model { title: item.data.title, tags: this.db.tags .filter((tag: ITag) => currentTags.find(i => i === tag.name)) - .map((tag: ITag) => ({ ...tag, link: `${this.db.themeConfig.domain}/tag/${tag.slug}${mode === 'preview' ? '/index.html' : ''}` })), + .map((tag: ITag) => ({ ...tag, link: `${this.db.themeConfig.domain}/tag/${tag.slug}` })), date: item.data.date, dateFormat: (themeConfig.dateFormat && moment(item.data.date).format(themeConfig.dateFormat)) || item.data.date, feature: item.data.feature && !item.data.feature.includes('http') - ? `${helper.changeFeatureImageUrlLocalToDomain(item.data.feature, this.db.themeConfig.domain, mode)}` + ? `${helper.changeFeatureImageUrlLocalToDomain(item.data.feature, this.db.themeConfig.domain)}` : item.data.feature || '', - link: `${this.db.themeConfig.domain}/post/${item.fileName}${mode === 'preview' ? '/index.html' : ''}`, + link: `${this.db.themeConfig.domain}/post/${item.fileName}`, hideInList: (item.data.hideInList === undefined && false) || item.data.hideInList, stats: readingTime(content), } @@ -311,12 +311,11 @@ export default class Renderer extends Model { const isSiteLink = menu.link.includes(this.db.setting.domain) if (isSiteLink) { - link = `${link}${mode === 'preview' ? '/index.html' : ''}` + link = `${link}` } return { ...menu, - link, } }) } @@ -324,7 +323,7 @@ export default class Renderer extends Model { /** * Render the article list, excluding hidden articles. */ - public async renderPostList(extraPath?: string, mode?: string) { + public async renderPostList(extraPath?: string) { const { postPageSize, archivesPageSize } = this.db.themeConfig // Compatible: < v0.7.0 @@ -390,18 +389,18 @@ export default class Renderer extends Model { if (i === 0 && excludeHidePostsData.length > pageSize) { fse.ensureDir(`${this.outputDir}${extraPath}/page`) - renderData.pagination.next = `${this.db.themeConfig.domain}${extraPath}/page/2/${mode === 'preview' ? 'index.html' : ''}` + renderData.pagination.next = `${this.db.themeConfig.domain}${extraPath}/page/2/` } else if (i > 0 && excludeHidePostsData.length > pageSize) { fse.ensureDir(`${this.outputDir}${extraPath}/page/${i + 1}`) renderPath = `${this.outputDir}${extraPath}/page/${i + 1}/index.html` renderData.pagination.prev = i === 1 - ? `${this.db.themeConfig.domain}${extraPath}/${mode === 'preview' ? 'index.html' : ''}` - : `${this.db.themeConfig.domain}${extraPath}/page/${i}/${mode === 'preview' ? 'index.html' : ''}` + ? `${this.db.themeConfig.domain}${extraPath}/` + : `${this.db.themeConfig.domain}${extraPath}/page/${i}/` renderData.pagination.next = (i + 1) * pageSize < excludeHidePostsData.length - ? `${this.db.themeConfig.domain}${extraPath}/page/${i + 2}/${mode === 'preview' ? 'index.html' : ''}` + ? `${this.db.themeConfig.domain}${extraPath}/page/${i + 2}/` : '' } else { fse.ensureDir(`${this.outputDir}${extraPath}`) @@ -514,7 +513,7 @@ export default class Renderer extends Model { /** * Render tag detail page */ - async renderTagDetail(mode?: string) { + async renderTagDetail() { const usedTags = this.db.tags.filter((tag: ITag) => tag.used) const { postPageSize } = this.db.themeConfig const excludeHidePostsData = this.postsData.filter((item: IPostRenderData) => !item.hideInList) @@ -558,18 +557,18 @@ export default class Renderer extends Model { if (i === 0 && posts.length > pageSize) { fse.ensureDirSync(`${tagFolderPath}/page`) - renderData.pagination.next = `${tagDomainPath}/page/2/${mode === 'preview' ? 'index.html' : ''}` + renderData.pagination.next = `${tagDomainPath}/page/2/` } else if (i > 0 && posts.length > pageSize) { fse.ensureDirSync(`${tagFolderPath}/page/${i + 1}`) renderPath = `${tagFolderPath}/page/${i + 1}/index.html` renderData.pagination.prev = i === 1 - ? `${tagDomainPath}${mode === 'preview' ? '/index.html' : ''}` - : `${tagDomainPath}/page/${i}/${mode === 'preview' ? 'index.html' : ''}` + ? `${tagDomainPath}` + : `${tagDomainPath}/page/${i}/` renderData.pagination.next = (i + 1) * pageSize < posts.length - ? `${tagDomainPath}/page/${i + 2}/${mode === 'preview' ? 'index.html' : ''}` + ? `${tagDomainPath}/page/${i + 2}/` : '' } diff --git a/yarn.lock b/yarn.lock index 5998fc38..88ade131 100644 --- a/yarn.lock +++ b/yarn.lock @@ -737,6 +737,21 @@ resolved "http://registry.npm.taobao.org/@types/bluebird/download/@types/bluebird-3.5.26.tgz#a38c438ae84fa02431d6892edf86e46edcbca291" integrity sha1-o4xDiuhPoCQx1oku34bkbty8opE= +"@types/body-parser@*": + version "1.17.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" + integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.32" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" + integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== + dependencies: + "@types/node" "*" + "@types/ejs@^2.6.3": version "2.6.3" resolved "http://registry.npm.taobao.org/@types/ejs/download/@types/ejs-2.6.3.tgz#b6509e9925d7eb5e95c8c73b6492e5baae7c1e6a" @@ -747,6 +762,23 @@ resolved "http://registry.npm.taobao.org/@types/events/download/@types/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" integrity sha1-KGLz9Yqaf3w+eNefEw3U1xwlwqc= +"@types/express-serve-static-core@*": + version "4.16.7" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.7.tgz#50ba6f8a691c08a3dd9fa7fba25ef3133d298049" + integrity sha512-847KvL8Q1y3TtFLRTXcVakErLJQgdpFSaq+k043xefz9raEf0C7HalpSY7OW5PyjCnY8P7bPW5t/Co9qqp+USg== + dependencies: + "@types/node" "*" + "@types/range-parser" "*" + +"@types/express@^4.17.0": + version "4.17.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.0.tgz#49eaedb209582a86f12ed9b725160f12d04ef287" + integrity sha512-CjaMu57cjgjuZbh9DpkloeGxV45CnMGlVd+XpG7Gm9QgVrd7KFq+X4HY0vM+2v0bczS48Wg7bvnMY5TN+Xmcfw== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "*" + "@types/serve-static" "*" + "@types/fs-extra@^5.0.5": version "5.0.5" resolved "http://registry.npm.taobao.org/@types/fs-extra/download/@types/fs-extra-5.0.5.tgz#080d90a792f3fa2c5559eb44bd8ef840aae9104b" @@ -796,6 +828,11 @@ resolved "http://registry.npm.taobao.org/@types/marked/download/@types/marked-0.6.5.tgz#3cf2a56ef615dad24aaf99784ef90a9eba4e29d8" integrity sha1-PPKlbvYV2tJKr5l4TvkKnrpOKdg= +"@types/mime@*": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" + integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== + "@types/minimatch@*": version "3.0.3" resolved "http://registry.npm.taobao.org/@types/minimatch/download/@types/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -819,6 +856,19 @@ version "1.5.1" resolved "http://registry.npm.taobao.org/@types/q/download/@types/q-1.5.1.tgz#48fd98c1561fe718b61733daed46ff115b496e18" +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== + +"@types/serve-static@*": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" + integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== + dependencies: + "@types/express-serve-static-core" "*" + "@types/mime" "*" + "@types/shortid@0.0.29": version "0.0.29" resolved "http://registry.npm.taobao.org/@types/shortid/download/@types/shortid-0.0.29.tgz#8093ee0416a6e2bf2aa6338109114b3fbffa0e9b" From 5a1d3e0afda6fd99b273d87aa2dba709ea6fc88f Mon Sep 17 00:00:00 2001 From: gaoliang Date: Wed, 24 Jul 2019 20:32:59 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20=E7=AB=AF=E5=8F=A3=E8=A2=AB?= =?UTF-8?q?=E5=8D=A0=E7=94=A8=E6=97=B6=EF=BC=8C=E8=87=AA=E5=8A=A8=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E7=AB=AF=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/background.ts | 6 ++++-- src/components/Main.vue | 8 +++++++- src/server.ts | 18 ++++++++++++++++-- src/server/app.ts | 4 ++++ src/server/events/site.ts | 5 +++++ src/server/interfaces/application.ts | 1 + src/server/renderer.ts | 6 ++++-- 7 files changed, 41 insertions(+), 7 deletions(-) diff --git a/src/background.ts b/src/background.ts index ae879949..a46080f2 100644 --- a/src/background.ts +++ b/src/background.ts @@ -8,7 +8,7 @@ import { } from 'vue-cli-plugin-electron-builder/lib' import App from './server/app' import messages from './assets/locales-menu' -import createServer from './server' +import initServer from './server' const isDevelopment = process.env.NODE_ENV !== 'production' @@ -105,12 +105,14 @@ function createWindow() { mainWindow: win, app, baseDir: __dirname, + previewServer: null, } // Init app const appInstance = new App(setting) console.log('Main process runing...', appInstance.appDir) // DELETE ME - createServer(`${appInstance.appDir}/output`) + const server = initServer(`${appInstance.appDir}/output`) + appInstance.previewServer = server } // Quit when all windows are closed. diff --git a/src/components/Main.vue b/src/components/Main.vue index 2fcc7f6c..2028752c 100644 --- a/src/components/Main.vue +++ b/src/components/Main.vue @@ -129,7 +129,13 @@ export default class App extends Vue { ipcRenderer.send('html-render') ipcRenderer.once('html-rendered', (event: Event, result: any) => { this.$message.success(`🎉 ${this.$t('renderSuccess')}`) - this.openInBrowser('http://localhost:9999') + ipcRenderer.send('app-preview-server-port-get') + ipcRenderer.once( + 'app-preview-server-port-got', + (portGotEvent: Event, port: any) => { + this.openInBrowser(`http://localhost:${port}`) + }, + ) }) } diff --git a/src/server.ts b/src/server.ts index 915ff2d5..c9d19ac1 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,7 +1,21 @@ import express from 'express' +import http from 'http' +import { AddressInfo } from 'net' -export default function createServer(SitePath: string) { +export default function initServer(SitePath: string) { const server = express() server.use(express.static(SitePath)) - server.listen(9999, () => console.log('Express listening on port 9999')) + function listen(port: number) { + server.listen(port, 'localhost').on('error', (err: NodeJS.ErrnoException) => { + if (err) { + console.log(`Express port ${port} is busy, trying with port ${port + 1}`) + listen(port + 1) + } + }).on('listening', () => { + server.set('port', port) + console.log(`Express server is running on port : ${port}`) + }) + } + listen(4000) + return server } diff --git a/src/server/app.ts b/src/server/app.ts index b620344c..109fc051 100644 --- a/src/server/app.ts +++ b/src/server/app.ts @@ -1,6 +1,7 @@ import { BrowserWindow, app } from 'electron' import * as fse from 'fs-extra' import * as path from 'path' +import Antd from 'ant-design-vue' import EventClasses from './events/index' import Posts from './posts' import Tags from './tags' @@ -22,6 +23,8 @@ export default class App { appDir: string + previewServer: any; + db: IApplicationDb constructor(setting: IApplicationSetting) { @@ -29,6 +32,7 @@ export default class App { this.app = setting.app this.baseDir = setting.baseDir this.appDir = path.join(this.app.getPath('documents'), 'gridea') + this.previewServer = setting.previewServer this.db = { posts: [], diff --git a/src/server/events/site.ts b/src/server/events/site.ts index 907ce870..3985b035 100644 --- a/src/server/events/site.ts +++ b/src/server/events/site.ts @@ -19,5 +19,10 @@ export default class SiteEvents { const result = await appInstance.saveSourceFolderSetting(params) event.sender.send('app-source-folder-set', result) }) + + ipcMain.on('app-preview-server-port-get', async (event: Event, params: string) => { + const port = await appInstance.previewServer.get('port') + event.sender.send('app-preview-server-port-got', port) + }) } } diff --git a/src/server/interfaces/application.ts b/src/server/interfaces/application.ts index 92ce4906..5224a724 100644 --- a/src/server/interfaces/application.ts +++ b/src/server/interfaces/application.ts @@ -9,6 +9,7 @@ export interface IApplicationSetting { mainWindow: BrowserWindow app: any baseDir: string + previewServer: any } export interface IApplicationDb { diff --git a/src/server/renderer.ts b/src/server/renderer.ts index dca43f9a..00dac380 100644 --- a/src/server/renderer.ts +++ b/src/server/renderer.ts @@ -34,6 +34,8 @@ export default class Renderer extends Model { git: SimpleGit + previewPort: number + platformAddress = '' remoteUrl = '' @@ -42,7 +44,7 @@ export default class Renderer extends Model { constructor(appInstance: any) { super(appInstance) - + this.previewPort = appInstance.previewServer.get('port') this.loadConfig() const { setting } = this.db @@ -60,7 +62,7 @@ export default class Renderer extends Model { } async preview() { - this.db.themeConfig.domain = 'http://localhost:9999' + this.db.themeConfig.domain = `http://localhost:${this.previewPort}` await this.renderAll() } From ab9c506e82c5419d077026654fd3022ad1abc56a Mon Sep 17 00:00:00 2001 From: gaoliang Date: Thu, 25 Jul 2019 11:58:23 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E6=9B=B4=E6=94=B9=E6=BA=90=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B9=E5=90=8E=20express=20=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/background.ts | 6 +++--- src/server.ts | 5 +---- src/server/app.ts | 5 ++++- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/background.ts b/src/background.ts index a46080f2..d60aa52d 100644 --- a/src/background.ts +++ b/src/background.ts @@ -101,18 +101,18 @@ function createWindow() { menu = Menu.buildFromTemplate(template) Menu.setApplicationMenu(menu) + const server = initServer() + const setting = { mainWindow: win, app, baseDir: __dirname, - previewServer: null, + previewServer: server, } // Init app const appInstance = new App(setting) console.log('Main process runing...', appInstance.appDir) // DELETE ME - const server = initServer(`${appInstance.appDir}/output`) - appInstance.previewServer = server } // Quit when all windows are closed. diff --git a/src/server.ts b/src/server.ts index c9d19ac1..f80c7464 100644 --- a/src/server.ts +++ b/src/server.ts @@ -1,10 +1,7 @@ import express from 'express' -import http from 'http' -import { AddressInfo } from 'net' -export default function initServer(SitePath: string) { +export default function initServer() { const server = express() - server.use(express.static(SitePath)) function listen(port: number) { server.listen(port, 'localhost').on('error', (err: NodeJS.ErrnoException) => { if (err) { diff --git a/src/server/app.ts b/src/server/app.ts index 109fc051..3e77aa92 100644 --- a/src/server/app.ts +++ b/src/server/app.ts @@ -2,6 +2,7 @@ import { BrowserWindow, app } from 'electron' import * as fse from 'fs-extra' import * as path from 'path' import Antd from 'ant-design-vue' +import express from 'express' import EventClasses from './events/index' import Posts from './posts' import Tags from './tags' @@ -118,7 +119,8 @@ export default class App { setting, commentSetting: commentSetting || this.db.commentSetting, } - + + this.previewServer.use('/', express.static(`${this.appDir}/output`)) this.initEvents() return { ...this.db, @@ -142,6 +144,7 @@ export default class App { await fse.writeFileSync(appConfigPath, jsonString) const appConfig = await fse.readJsonSync(appConfigPath) this.appDir = appConfig.sourceFolder + this.previewServer.use('/', express.static(`${this.appDir}/output`)) this.checkDir() From 6dafe42954dfd249258d22efa8ceb97c2f7bbbb2 Mon Sep 17 00:00:00 2001 From: gaoliang Date: Fri, 26 Jul 2019 16:02:42 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20=E6=9B=B4=E6=94=B9=E6=BA=90=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B9=E9=A2=84=E8=A7=88=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E6=9C=AA=E5=90=8C=E6=AD=A5=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/server/app.ts | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/server/app.ts b/src/server/app.ts index 3e77aa92..098ad327 100644 --- a/src/server/app.ts +++ b/src/server/app.ts @@ -119,8 +119,7 @@ export default class App { setting, commentSetting: commentSetting || this.db.commentSetting, } - - this.previewServer.use('/', express.static(`${this.appDir}/output`)) + this.updateStaticServer() this.initEvents() return { ...this.db, @@ -144,7 +143,7 @@ export default class App { await fse.writeFileSync(appConfigPath, jsonString) const appConfig = await fse.readJsonSync(appConfigPath) this.appDir = appConfig.sourceFolder - this.previewServer.use('/', express.static(`${this.appDir}/output`)) + this.updateStaticServer() this.checkDir() @@ -238,6 +237,22 @@ export default class App { } } + private updateStaticServer(): void { + function removeMiddlewares(route: any, i: number, routes: any) { + if (route.handle.name === 'serveStatic') { + routes.splice(i, 1) + console.log('Preview server: Removed old staic route') + } + } + const routers = this.previewServer._router // eslint-disable-line no-underscore-dangle + if (routers) { + const routesStack = routers.stack + routesStack.forEach(removeMiddlewares) + } + this.previewServer.use(express.static(`${this.appDir}/output`)) + console.log(`Preview server: Static dir change to ${this.appDir}/output`) + } + private initEvents(): void { const { SiteEvents,