From e2239b42e021700d94ba4b15e236eaea86542fbf Mon Sep 17 00:00:00 2001 From: Nanashi Date: Thu, 5 Jan 2023 07:41:27 +0900 Subject: [PATCH 01/16] =?UTF-8?q?Add:=20=E3=82=B9=E3=82=BF=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E6=AF=8E=E3=81=AE=E3=83=9D=E3=83=BC=E3=83=88=E3=83=AC?= =?UTF-8?q?=E3=83=BC=E3=83=88=E3=82=92=E8=BF=BD=E5=8A=A0=20(#1083)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update: openapiを0.14.0-preview.6に更新 * Add: linguist-generatedを追加 * Change: =trueを明示 * Fix: **/*を指定 * Fix: ./を削除 * Fix: .tsを指定 * Revert: .tsを削除 * Add: 一時的な解決策を追加 * Add: openapi.jsonを生成ファイルとしてマーク * Restore src/store/proxy.ts * Add: スタイル毎のポートレートを追加 * Delete: 不要なファイルを削除 --- src/components/CharacterPortrait.vue | 16 ++++++++++++---- src/store/audio.ts | 4 +++- src/type/preload.ts | 1 + 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/components/CharacterPortrait.vue b/src/components/CharacterPortrait.vue index c8651324e2..49c593f779 100644 --- a/src/components/CharacterPortrait.vue +++ b/src/components/CharacterPortrait.vue @@ -40,17 +40,23 @@ export default defineComponent({ return store.getters.CHARACTER_INFO(engineId, styleId); }); - const characterName = computed(() => { + const styleInfo = computed(() => { const activeAudioKey = store.getters.ACTIVE_AUDIO_KEY; + const audioItem = activeAudioKey ? store.state.audioItems[activeAudioKey] : undefined; + const styleId = audioItem?.styleId; const style = characterInfo.value?.metas.styles.find( (style) => style.styleId === styleId ); - return style?.styleName - ? `${characterInfo.value?.metas.speakerName} (${style?.styleName})` + return style; + }); + + const characterName = computed(() => { + return styleInfo.value?.styleName + ? `${characterInfo.value?.metas.speakerName} (${styleInfo.value?.styleName})` : characterInfo.value?.metas.speakerName; }); @@ -64,7 +70,9 @@ export default defineComponent({ return engineInfo?.name; }); - const portraitPath = computed(() => characterInfo.value?.portraitPath); + const portraitPath = computed( + () => styleInfo.value?.portraitPath || characterInfo.value?.portraitPath + ); const isInitializingSpeaker = computed(() => { const activeAudioKey = store.getters.ACTIVE_AUDIO_KEY; diff --git a/src/store/audio.ts b/src/store/audio.ts index 7fe0fa3cdb..a810818674 100644 --- a/src/store/audio.ts +++ b/src/store/audio.ts @@ -255,6 +255,8 @@ export const audioStore = createPartialStore({ styleId: style.id, engineId, iconPath: base64ImageToUri(styleInfo.icon), + portraitPath: + styleInfo.portrait && base64ImageToUri(styleInfo.portrait), voiceSamplePaths: voiceSamples, }; }); @@ -279,7 +281,7 @@ export const audioStore = createPartialStore({ metas: { speakerUuid: speaker.speakerUuid, speakerName: speaker.name, - styles: styles, + styles, policy: speakerInfo.policy, }, }; diff --git a/src/type/preload.ts b/src/type/preload.ts index ad4d49b006..71989dde8c 100644 --- a/src/type/preload.ts +++ b/src/type/preload.ts @@ -115,6 +115,7 @@ export type StyleInfo = { styleName?: string; styleId: number; iconPath: string; + portraitPath: string | undefined; engineId: string; voiceSamplePaths: string[]; }; From 7c7142126e9975cafc2f7c3c36de87557f0f8038 Mon Sep 17 00:00:00 2001 From: sabonerune <102559104+sabonerune@users.noreply.github.com> Date: Thu, 5 Jan 2023 11:54:25 +0900 Subject: [PATCH 02/16] =?UTF-8?q?FIX:=20electron-store=E3=81=AE=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E5=A0=B4=E6=89=80=E3=82=92GPU=E7=89=88=E3=81=A8?= =?UTF-8?q?=E7=B5=B1=E4=B8=80=E3=81=99=E3=82=8B=20(#1005)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/qAndA.md | 4 ++-- src/background.ts | 26 +++++++++++++++++--------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/public/qAndA.md b/public/qAndA.md index ea12f9b224..08bf2eb314 100644 --- a/public/qAndA.md +++ b/public/qAndA.md @@ -87,11 +87,11 @@ VOICEVOX Twitter アカウント [@voicevox_pj](https://twitter.com/voicevox_pj) #### Windows 版 -`C:\Users\(ユーザー名)\AppData\Roaming\voicevox` もしくは `C:\Users\(ユーザー名)\AppData\Roaming\voicevox-cpu` +`C:\Users\(ユーザー名)\AppData\Roaming\voicevox` #### Mac 版 -`/Users/(ユーザー名)/Library/Application Support/voicevox-cpu` +`/Users/(ユーザー名)/Library/Application Support/voicevox` ### Q. エンジンの起動が失敗したというエラーが表示されます。 diff --git a/src/background.ts b/src/background.ts index 530281167f..4b172973a7 100644 --- a/src/background.ts +++ b/src/background.ts @@ -41,24 +41,32 @@ type SingleInstanceLockData = { filePath: string | undefined; }; +const isDevelopment = process.env.NODE_ENV !== "production"; + +// Electronの設定ファイルの保存場所を変更 +const fixedUserDataDir = path.join( + app.getPath("appData"), + `voicevox${isDevelopment ? "-dev" : ""}` +); +if (!fs.existsSync(fixedUserDataDir)) { + fs.mkdirSync(fixedUserDataDir); +} +app.setPath("userData", fixedUserDataDir); + // silly以上のログをコンソールに出力 log.transports.console.format = "[{h}:{i}:{s}.{ms}] [{level}] {text}"; log.transports.console.level = "silly"; // warn以上のログをファイルに出力 const prefix = dayjs().format("YYYYMMDD_HHmmss"); +const logPath = app.getPath("logs"); log.transports.file.format = "[{h}:{i}:{s}.{ms}] [{level}] {text}"; log.transports.file.level = "warn"; log.transports.file.fileName = `${prefix}_error.log`; - -const isDevelopment = process.env.NODE_ENV !== "production"; - -if (isDevelopment) { - app.setPath( - "userData", - path.join(app.getPath("appData"), `${app.getName()}-dev`) - ); -} +log.transports.file.resolvePath = (variables) => { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return path.join(logPath, variables.fileName!); +}; let win: BrowserWindow; From a9c660cdd6b2ddf1da57f0aec260afd323acc6f0 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Thu, 5 Jan 2023 11:58:44 +0900 Subject: [PATCH 03/16] =?UTF-8?q?=E3=83=A1=E3=82=A4=E3=83=B3=E3=83=97?= =?UTF-8?q?=E3=83=AD=E3=82=BB=E3=82=B9=E5=81=B4=E3=81=AERESTART=5FENGINE?= =?UTF-8?q?=5FALL=E3=81=8C=E4=BD=BF=E3=82=8F=E3=82=8C=E3=81=A6=E3=81=AA?= =?UTF-8?q?=E3=81=84=E3=81=AE=E3=81=A7=E6=B6=88=E3=81=97=E3=81=A6=E3=81=8A?= =?UTF-8?q?=E3=81=8F=20(#1090)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/background.ts | 4 ---- src/background/engineManager.ts | 11 ----------- src/electron/preload.ts | 4 ---- src/type/preload.ts | 1 - 4 files changed, 20 deletions(-) diff --git a/src/background.ts b/src/background.ts index 4b172973a7..6bf5928a2b 100644 --- a/src/background.ts +++ b/src/background.ts @@ -899,10 +899,6 @@ ipcMainHandle("ENGINE_INFOS", () => { * エンジンを再起動する。 * エンジンの起動が開始したらresolve、起動が失敗したらreject。 */ -ipcMainHandle("RESTART_ENGINE_ALL", async () => { - await engineManager.restartEngineAll(win); -}); - ipcMainHandle("RESTART_ENGINE", async (_, { engineId }) => { await engineManager.restartEngine(engineId, win); }); diff --git a/src/background/engineManager.ts b/src/background/engineManager.ts index 936c6a8199..e1990400c0 100644 --- a/src/background/engineManager.ts +++ b/src/background/engineManager.ts @@ -378,17 +378,6 @@ export class EngineManager { }); } - /** - * 全てのエンジンを再起動する。 - * FIXME: winを受け取らなくても良いようにする - */ - async restartEngineAll(win: BrowserWindow) { - const engineInfos = this.fetchEngineInfos(); - for (const engineInfo of engineInfos) { - await this.restartEngine(engineInfo.uuid, win); - } - } - /** * エンジンを再起動する。 * FIXME: winを受け取らなくても良いようにする diff --git a/src/electron/preload.ts b/src/electron/preload.ts index bb3fd80b57..bda9db4d98 100644 --- a/src/electron/preload.ts +++ b/src/electron/preload.ts @@ -185,10 +185,6 @@ const api: Sandbox = { return ipcRendererInvoke("ENGINE_INFOS"); }, - restartEngineAll: () => { - return ipcRendererInvoke("RESTART_ENGINE_ALL"); - }, - restartEngine: (engineId: string) => { return ipcRendererInvoke("RESTART_ENGINE", { engineId }); }, diff --git a/src/type/preload.ts b/src/type/preload.ts index 71989dde8c..7f07653892 100644 --- a/src/type/preload.ts +++ b/src/type/preload.ts @@ -83,7 +83,6 @@ export interface Sandbox { logError(...params: unknown[]): void; logInfo(...params: unknown[]): void; engineInfos(): Promise; - restartEngineAll(): Promise; restartEngine(engineId: string): Promise; openEngineDirectory(engineId: string): void; hotkeySettings(newData?: HotkeySetting): Promise; From 82599ef199d38f83affc9db6fb23b84858a30b9a Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Thu, 5 Jan 2023 12:12:18 +0900 Subject: [PATCH 04/16] =?UTF-8?q?=E3=83=AD=E3=82=B0=E3=82=92=E3=83=96?= =?UTF-8?q?=E3=83=A9=E3=82=A6=E3=82=B6=E3=81=AEconsole.log=E3=81=AB?= =?UTF-8?q?=E3=82=82=E5=87=BA=E5=8A=9B=20(#1091)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/background.ts | 4 ++++ src/electron/preload.ts | 7 +++++++ src/store/index.ts | 6 ++++++ src/store/type.ts | 4 ++++ src/store/ui.ts | 4 +++- src/type/ipc.ts | 5 +++++ src/type/preload.ts | 1 + 7 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/background.ts b/src/background.ts index 6bf5928a2b..8b5a4eef3e 100644 --- a/src/background.ts +++ b/src/background.ts @@ -886,6 +886,10 @@ ipcMainHandle("LOG_ERROR", (_, ...params) => { log.error(...params); }); +ipcMainHandle("LOG_WARN", (_, ...params) => { + log.warn(...params); +}); + ipcMainHandle("LOG_INFO", (_, ...params) => { log.info(...params); }); diff --git a/src/electron/preload.ts b/src/electron/preload.ts index bda9db4d98..09cc49793d 100644 --- a/src/electron/preload.ts +++ b/src/electron/preload.ts @@ -174,10 +174,17 @@ const api: Sandbox = { }, logError: (...params) => { + console.error(...params); return ipcRenderer.invoke("LOG_ERROR", ...params); }, + logWarn: (...params) => { + console.warn(...params); + return ipcRenderer.invoke("LOG_WARN", ...params); + }, + logInfo: (...params) => { + console.info(...params); return ipcRenderer.invoke("LOG_INFO", ...params); }, diff --git a/src/store/index.ts b/src/store/index.ts index f612f77ba4..ffcde99ca7 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -267,6 +267,12 @@ export const indexStore = createPartialStore({ }, }, + LOG_WARN: { + action(_, ...params: unknown[]) { + window.electron.logWarn(...params); + }, + }, + LOG_INFO: { action(_, ...params: unknown[]) { window.electron.logInfo(...params); diff --git a/src/store/type.ts b/src/store/type.ts index fc3aa2f7dc..40603e67e5 100644 --- a/src/store/type.ts +++ b/src/store/type.ts @@ -833,6 +833,10 @@ export type IndexStoreTypes = { action(...payload: unknown[]): void; }; + LOG_WARN: { + action(...payload: unknown[]): void; + }; + LOG_INFO: { action(...payload: unknown[]): void; }; diff --git a/src/store/ui.ts b/src/store/ui.ts index d2697e5c77..c1870b42ea 100644 --- a/src/store/ui.ts +++ b/src/store/ui.ts @@ -97,7 +97,9 @@ export const uiStore = createPartialStore({ state.uiLockCount--; } else { // eslint-disable-next-line no-console - console.warn("UNLOCK_UI is called when state.uiLockCount == 0"); + window.electron.logWarn( + "UNLOCK_UI is called when state.uiLockCount == 0" + ); } }, action({ commit }) { diff --git a/src/type/ipc.ts b/src/type/ipc.ts index a8f70fddac..bd91d47ab7 100644 --- a/src/type/ipc.ts +++ b/src/type/ipc.ts @@ -178,6 +178,11 @@ export type IpcIHData = { return: void; }; + LOG_WARN: { + args: [...params: unknown[]]; + return: void; + }; + LOG_INFO: { args: [...params: unknown[]]; return: void; diff --git a/src/type/preload.ts b/src/type/preload.ts index 7f07653892..2d99a9163c 100644 --- a/src/type/preload.ts +++ b/src/type/preload.ts @@ -81,6 +81,7 @@ export interface Sandbox { minimizeWindow(): void; maximizeWindow(): void; logError(...params: unknown[]): void; + logWarn(...params: unknown[]): void; logInfo(...params: unknown[]): void; engineInfos(): Promise; restartEngine(engineId: string): Promise; From 9869e23cc1aa1afed3dfbd7077e85b14d036556e Mon Sep 17 00:00:00 2001 From: Nanashi Date: Sat, 7 Jan 2023 16:52:59 +0900 Subject: [PATCH 05/16] =?UTF-8?q?script=20setup=EF=BC=9A=E3=83=9E=E3=83=BC?= =?UTF-8?q?=E3=82=AF=E3=83=80=E3=82=A6=E3=83=B3=E7=B3=BB=E3=81=AE=E3=82=B3?= =?UTF-8?q?=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=8D=E3=83=B3=E3=83=88=E3=82=92?= =?UTF-8?q?=E7=A7=BB=E8=A1=8C=20(#1093)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update: vueとquasarを更新 * Delete: @vue/compiler-sfcを削除 * Migrate: AcceptRetrieveTelemetryDialog.vueを移行 * Migrate: AcceptTermsDialog.vueを移行 * Migrate: HelpPolicy.vueを移行 * Migrate: HowToUse.vueを移行 * Migrate: OssComunityInfo.vueを移行 * Migrate: QAndA.vueを移行 --- .../AcceptRetrieveTelemetryDialog.vue | 66 ++++++++----------- src/components/AcceptTermsDialog.vue | 62 ++++++++--------- src/components/HelpPolicy.vue | 30 +++------ src/components/HowToUse.vue | 22 +++---- src/components/OssCommunityInfo.vue | 26 +++----- src/components/QAndA.vue | 22 ++----- 6 files changed, 88 insertions(+), 140 deletions(-) diff --git a/src/components/AcceptRetrieveTelemetryDialog.vue b/src/components/AcceptRetrieveTelemetryDialog.vue index f7f589504a..bdb2102d67 100644 --- a/src/components/AcceptRetrieveTelemetryDialog.vue +++ b/src/components/AcceptRetrieveTelemetryDialog.vue @@ -63,53 +63,41 @@ - diff --git a/src/components/AcceptTermsDialog.vue b/src/components/AcceptTermsDialog.vue index 19180e5402..4990be92a2 100644 --- a/src/components/AcceptTermsDialog.vue +++ b/src/components/AcceptTermsDialog.vue @@ -60,50 +60,40 @@ - diff --git a/src/components/HelpPolicy.vue b/src/components/HelpPolicy.vue index aba4053e85..8c0af4c28d 100644 --- a/src/components/HelpPolicy.vue +++ b/src/components/HelpPolicy.vue @@ -4,30 +4,20 @@ - diff --git a/src/components/HowToUse.vue b/src/components/HowToUse.vue index c86ece8450..7ce460c2dc 100644 --- a/src/components/HowToUse.vue +++ b/src/components/HowToUse.vue @@ -4,22 +4,16 @@ - diff --git a/src/components/OssCommunityInfo.vue b/src/components/OssCommunityInfo.vue index 081f9fd1c4..e33e2df2ec 100644 --- a/src/components/OssCommunityInfo.vue +++ b/src/components/OssCommunityInfo.vue @@ -4,24 +4,18 @@ - diff --git a/src/components/QAndA.vue b/src/components/QAndA.vue index 589b3c4678..ca5338248d 100644 --- a/src/components/QAndA.vue +++ b/src/components/QAndA.vue @@ -4,26 +4,18 @@ - From ef1522903a06e54ba834caea96f665e6b06ac66e Mon Sep 17 00:00:00 2001 From: Nanashi Date: Sun, 8 Jan 2023 16:30:36 +0900 Subject: [PATCH 06/16] =?UTF-8?q?Add:=20node=5Fmodules=E3=82=92=E3=82=AD?= =?UTF-8?q?=E3=83=A3=E3=83=83=E3=82=B7=E3=83=A5=E3=81=99=E3=82=8B=E3=82=88?= =?UTF-8?q?=E3=81=86=E3=81=AB=20(#1064)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0f098bdaff..54e3d41d51 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -4,7 +4,7 @@ on: push: pull_request: branches: - - '**' + - "**" workflow_dispatch: jobs: @@ -46,7 +46,16 @@ jobs: restore-keys: | ${{ env.cache-version }}-${{ runner.os }}--electron-builder-cache- + - name: Cache node_modules + uses: actions/cache@v3 + id: cache-node-modules + with: + path: node_modules + key: ${{ env.cache-version }}-${{ runner.os }}--node-modules-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ env.cache-version }}-${{ runner.os }}--node-modules- - run: npm ci + if: steps.cache-node-modules.outputs.cache-hit != 'true' - run: npm run typecheck - run: npm run lint - run: npm run markdownlint From 327794fe6ac1ceff293aaa3582ea198d8f72689b Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Mon, 9 Jan 2023 15:10:55 +0900 Subject: [PATCH 07/16] =?UTF-8?q?EngineId=E3=80=81SpeakerId=E3=80=81StyleI?= =?UTF-8?q?d=E3=81=AE=E8=AA=AC=E6=98=8E=E3=81=8C=E9=96=93=E9=81=95?= =?UTF-8?q?=E3=81=A3=E3=81=A6=E3=82=8B=E3=81=A8=E3=81=93=E3=82=8D=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=20(#1098)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" "b/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" index 1939bdb97a..ac10b3c382 100644 --- "a/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" +++ "b/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" @@ -8,10 +8,11 @@ EngineId はエンジンが持つ ID で、世界で唯一かつ不変です。 SpeakerId は話者が持つ ID で、世界で唯一かつ不変。エンジン間でも同じ ID を持ちます。 -StyleId はスタイルごとの ID で、話者ごとに唯一であれば良いです。 +StyleId はスタイルごとの ID で、エンジンごとに唯一であれば良いです。 声を一意に決めるには、(EngineId, SpeakerId, StyleId)の3組が揃っている必要がある、という仕様を目指しています。 現状は、音声合成APIに SpeakerId 引数が無いため、(EngineId, StyleId)の2組で一意に声が決まっています。 +現状は StyleId はエンジンごとに唯一である必要がありますが、話者ごとに唯一であれば良いという仕様を目指しています。 VOICEVOX は歴史的経緯により、 SpeakerId と StyleId が混同していることがあります。 特に型が整数値になっている SpeakerId は StyleId と混同している場合があります。 From 2830cc0c4bc9924182394e300289321d97f0f7a0 Mon Sep 17 00:00:00 2001 From: Nanashi Date: Thu, 12 Jan 2023 01:28:15 +0900 Subject: [PATCH 08/16] =?UTF-8?q?script=20setup=EF=BC=9Atemplate=E3=80=81s?= =?UTF-8?q?cript=E3=80=81style=E3=81=AE=E9=A0=86=E5=BA=8F=E3=82=92?= =?UTF-8?q?=E7=B5=B1=E4=B8=80=20(#1100)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .eslintrc.js | 6 ++++++ ...0\255\350\250\210\346\226\271\351\207\235.md" | 5 +++++ src/components/MenuItem.vue | 16 ++++++++-------- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index b3f6f5a712..c21c94b88d 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -42,6 +42,12 @@ module.exports = { ignoreRestSiblings: true, }, ], + "vue/component-tags-order": [ + "error", + { + order: ["template", "script", "style"], + }, + ], }, overrides: [ { diff --git "a/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" "b/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" index ac10b3c382..0e8d453615 100644 --- "a/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" +++ "b/docs/\347\264\260\343\201\213\343\201\204\350\250\255\350\250\210\346\226\271\351\207\235.md" @@ -19,3 +19,8 @@ VOICEVOX は歴史的経緯により、 SpeakerId と StyleId が混同してい (エンジン API の SpeakerId 引数に StyleId を渡したりなど。) StyleId は現在整数値型になっていますが、将来的にはUuidにしたいと考えています。 + +## シングルファイルコンポーネント(SFC、`.vue`ファイル)のtemplate、script、styleの順序 + +`