ストリーミングが不安定な問題を修正
This commit is contained in:
		
							parent
							
								
									f3b3e06329
								
							
						
					
					
						commit
						2953ba17c3
					
				
					 17 changed files with 61 additions and 58 deletions
				
			
		|  | @ -242,6 +242,9 @@ npx ts-node ./node_modules/typeorm/cli.js migration:generate -n 変更の名前 | |||
| 
 | ||||
| 作成されたスクリプトは不必要な変更を含むため除去してください。 | ||||
| 
 | ||||
| ### コネクションには`markRaw`せよ | ||||
| **Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。 | ||||
| 
 | ||||
| ## その他 | ||||
| ### HTMLのクラス名で follow という単語は使わない | ||||
| 広告ブロッカーで誤ってブロックされる | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import XNavFolder from './drive.nav-folder.vue'; | ||||
| import XFolder from './drive.folder.vue'; | ||||
| import XFile from './drive.file.vue'; | ||||
|  | @ -139,7 +139,7 @@ export default defineComponent({ | |||
| 			}); | ||||
| 		} | ||||
| 
 | ||||
| 		this.connection = os.stream.useChannel('drive'); | ||||
| 		this.connection = markRaw(os.stream.useChannel('drive')); | ||||
| 
 | ||||
| 		this.connection.on('fileCreated', this.onStreamDriveFileCreated); | ||||
| 		this.connection.on('fileUpdated', this.onStreamDriveFileUpdated); | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import * as os from '@client/os'; | ||||
| 
 | ||||
| export default defineComponent({ | ||||
|  | @ -71,7 +71,7 @@ export default defineComponent({ | |||
| 	}, | ||||
| 
 | ||||
| 	mounted() { | ||||
| 		this.connection = os.stream.useChannel('main'); | ||||
| 		this.connection = markRaw(os.stream.useChannel('main')); | ||||
| 
 | ||||
| 		this.connection.on('follow', this.onFollowChange); | ||||
| 		this.connection.on('unfollow', this.onFollowChange); | ||||
|  |  | |||
|  | @ -58,7 +58,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import { getNoteSummary } from '@/misc/get-note-summary'; | ||||
| import XReactionIcon from './reaction-icon.vue'; | ||||
| import MkFollowButton from './follow-button.vue'; | ||||
|  | @ -109,7 +109,7 @@ export default defineComponent({ | |||
| 
 | ||||
| 			this.readObserver.observe(this.$el); | ||||
| 
 | ||||
| 			this.connection = os.stream.useChannel('main'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('main')); | ||||
| 			this.connection.on('readAllNotifications', () => this.readObserver.unobserve(this.$el)); | ||||
| 		} | ||||
| 	}, | ||||
|  |  | |||
|  | @ -21,7 +21,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent, PropType } from 'vue'; | ||||
| import { defineComponent, PropType, markRaw } from 'vue'; | ||||
| import paging from '@client/scripts/paging'; | ||||
| import XNotification from './notification.vue'; | ||||
| import XList from './date-separated-list.vue'; | ||||
|  | @ -89,7 +89,7 @@ export default defineComponent({ | |||
| 	}, | ||||
| 
 | ||||
| 	mounted() { | ||||
| 		this.connection = os.stream.useChannel('main'); | ||||
| 		this.connection = markRaw(os.stream.useChannel('main')); | ||||
| 		this.connection.on('notification', this.onNotification); | ||||
| 	}, | ||||
| 
 | ||||
|  |  | |||
|  | @ -3,7 +3,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import XNotes from './notes.vue'; | ||||
| import * as os from '@client/os'; | ||||
| import * as sound from '@client/scripts/sound'; | ||||
|  | @ -92,33 +92,33 @@ export default defineComponent({ | |||
| 			this.query = { | ||||
| 				antennaId: this.antenna | ||||
| 			}; | ||||
| 			this.connection = os.stream.useChannel('antenna', { | ||||
| 			this.connection = markRaw(os.stream.useChannel('antenna', { | ||||
| 				antennaId: this.antenna | ||||
| 			}); | ||||
| 			})); | ||||
| 			this.connection.on('note', prepend); | ||||
| 		} else if (this.src == 'home') { | ||||
| 			endpoint = 'notes/timeline'; | ||||
| 			this.connection = os.stream.useChannel('homeTimeline'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('homeTimeline')); | ||||
| 			this.connection.on('note', prepend); | ||||
| 
 | ||||
| 			this.connection2 = os.stream.useChannel('main'); | ||||
| 			this.connection2 = markRaw(os.stream.useChannel('main')); | ||||
| 			this.connection2.on('follow', onChangeFollowing); | ||||
| 			this.connection2.on('unfollow', onChangeFollowing); | ||||
| 		} else if (this.src == 'local') { | ||||
| 			endpoint = 'notes/local-timeline'; | ||||
| 			this.connection = os.stream.useChannel('localTimeline'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('localTimeline')); | ||||
| 			this.connection.on('note', prepend); | ||||
| 		} else if (this.src == 'social') { | ||||
| 			endpoint = 'notes/hybrid-timeline'; | ||||
| 			this.connection = os.stream.useChannel('hybridTimeline'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('hybridTimeline')); | ||||
| 			this.connection.on('note', prepend); | ||||
| 		} else if (this.src == 'global') { | ||||
| 			endpoint = 'notes/global-timeline'; | ||||
| 			this.connection = os.stream.useChannel('globalTimeline'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('globalTimeline')); | ||||
| 			this.connection.on('note', prepend); | ||||
| 		} else if (this.src == 'mentions') { | ||||
| 			endpoint = 'notes/mentions'; | ||||
| 			this.connection = os.stream.useChannel('main'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('main')); | ||||
| 			this.connection.on('mention', prepend); | ||||
| 		} else if (this.src == 'directs') { | ||||
| 			endpoint = 'notes/mentions'; | ||||
|  | @ -130,16 +130,16 @@ export default defineComponent({ | |||
| 					prepend(note); | ||||
| 				} | ||||
| 			}; | ||||
| 			this.connection = os.stream.useChannel('main'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('main')); | ||||
| 			this.connection.on('mention', onNote); | ||||
| 		} else if (this.src == 'list') { | ||||
| 			endpoint = 'notes/user-list-timeline'; | ||||
| 			this.query = { | ||||
| 				listId: this.list | ||||
| 			}; | ||||
| 			this.connection = os.stream.useChannel('userList', { | ||||
| 			this.connection = markRaw(os.stream.useChannel('userList', { | ||||
| 				listId: this.list | ||||
| 			}); | ||||
| 			})); | ||||
| 			this.connection.on('note', prepend); | ||||
| 			this.connection.on('userAdded', onUserAdded); | ||||
| 			this.connection.on('userRemoved', onUserRemoved); | ||||
|  | @ -148,9 +148,9 @@ export default defineComponent({ | |||
| 			this.query = { | ||||
| 				channelId: this.channel | ||||
| 			}; | ||||
| 			this.connection = os.stream.useChannel('channel', { | ||||
| 			this.connection = markRaw(os.stream.useChannel('channel', { | ||||
| 				channelId: this.channel | ||||
| 			}); | ||||
| 			})); | ||||
| 			this.connection.on('note', prepend); | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,7 +6,7 @@ import '@client/style.scss'; | |||
| 
 | ||||
| import * as Sentry from '@sentry/browser'; | ||||
| import { Integrations } from '@sentry/tracing'; | ||||
| import { computed, createApp, watch } from 'vue'; | ||||
| import { computed, createApp, watch, markRaw } from 'vue'; | ||||
| 
 | ||||
| import widgets from '@client/widgets'; | ||||
| import directives from '@client/directives'; | ||||
|  | @ -282,7 +282,7 @@ if ($i) { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	const main = stream.useChannel('main', null, 'System'); | ||||
| 	const main = markRaw(stream.useChannel('main', null, 'System')); | ||||
| 
 | ||||
| 	// 自分の情報が更新されたとき
 | ||||
| 	main.on('meUpdated', i => { | ||||
|  |  | |||
|  | @ -90,7 +90,7 @@ export default defineComponent({ | |||
| 			stats: null, | ||||
| 			serverInfo: null, | ||||
| 			connection: null, | ||||
| 			queueConnection: os.stream.useChannel('queueStats'), | ||||
| 			queueConnection: markRaw(os.stream.useChannel('queueStats')), | ||||
| 			memUsage: 0, | ||||
| 			chartCpuMem: null, | ||||
| 			chartNet: null, | ||||
|  | @ -121,7 +121,7 @@ export default defineComponent({ | |||
| 		os.api('admin/server-info', {}).then(res => { | ||||
| 			this.serverInfo = res; | ||||
| 
 | ||||
| 			this.connection = os.stream.useChannel('serverStats'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('serverStats')); | ||||
| 			this.connection.on('stats', this.onStats); | ||||
| 			this.connection.on('statsLog', this.onStatsLog); | ||||
| 			this.connection.send('requestLog', { | ||||
|  |  | |||
|  | @ -11,7 +11,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import MkButton from '@client/components/ui/button.vue'; | ||||
| import XQueue from './queue.chart.vue'; | ||||
| import FormBase from '@client/components/form/base.vue'; | ||||
|  | @ -35,7 +35,7 @@ export default defineComponent({ | |||
| 				title: this.$ts.jobQueue, | ||||
| 				icon: 'fas fa-clipboard-list', | ||||
| 			}, | ||||
| 			connection: os.stream.useChannel('queueStats'), | ||||
| 			connection: markRaw(os.stream.useChannel('queueStats')), | ||||
| 		} | ||||
| 	}, | ||||
| 
 | ||||
|  |  | |||
|  | @ -37,7 +37,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineAsyncComponent, defineComponent } from 'vue'; | ||||
| import { defineAsyncComponent, defineComponent, markRaw } from 'vue'; | ||||
| import { getAcct } from '@/misc/acct'; | ||||
| import MkButton from '@client/components/ui/button.vue'; | ||||
| import { acct } from '../../filters/user'; | ||||
|  | @ -63,7 +63,7 @@ export default defineComponent({ | |||
| 	}, | ||||
| 
 | ||||
| 	mounted() { | ||||
| 		this.connection = os.stream.useChannel('messagingIndex'); | ||||
| 		this.connection = markRaw(os.stream.useChannel('messagingIndex')); | ||||
| 
 | ||||
| 		this.connection.on('message', this.onMessage); | ||||
| 		this.connection.on('read', this.onRead); | ||||
|  |  | |||
|  | @ -36,7 +36,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { computed, defineComponent } from 'vue'; | ||||
| import { computed, defineComponent, markRaw } from 'vue'; | ||||
| import XList from '@client/components/date-separated-list.vue'; | ||||
| import XMessage from './messaging-room.message.vue'; | ||||
| import XForm from './messaging-room.form.vue'; | ||||
|  | @ -141,10 +141,10 @@ const Component = defineComponent({ | |||
| 				this.group = group; | ||||
| 			} | ||||
| 
 | ||||
| 			this.connection = os.stream.useChannel('messaging', { | ||||
| 			this.connection = markRaw(os.stream.useChannel('messaging', { | ||||
| 				otherparty: this.user ? this.user.id : undefined, | ||||
| 				group: this.group ? this.group.id : undefined, | ||||
| 			}); | ||||
| 			})); | ||||
| 
 | ||||
| 			this.connection.on('message', this.onMessage); | ||||
| 			this.connection.on('read', this.onRead); | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import GameSetting from './game.setting.vue'; | ||||
| import GameBoard from './game.board.vue'; | ||||
| import * as os from '@client/os'; | ||||
|  | @ -61,9 +61,9 @@ export default defineComponent({ | |||
| 				if (this.connection) { | ||||
| 					this.connection.dispose(); | ||||
| 				} | ||||
| 				this.connection = os.stream.useChannel('gamesReversiGame', { | ||||
| 				this.connection = markRaw(os.stream.useChannel('gamesReversiGame', { | ||||
| 					gameId: this.game.id | ||||
| 				}); | ||||
| 				})); | ||||
| 				this.connection.on('started', this.onStarted); | ||||
| 			}); | ||||
| 		}, | ||||
|  |  | |||
|  | @ -60,7 +60,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import * as os from '@client/os'; | ||||
| import MkButton from '@client/components/ui/button.vue'; | ||||
| import MkFolder from '@client/components/ui/folder.vue'; | ||||
|  | @ -92,7 +92,7 @@ export default defineComponent({ | |||
| 
 | ||||
| 	mounted() { | ||||
| 		if (this.$i) { | ||||
| 			this.connection = os.stream.useChannel('gamesReversi'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('gamesReversi')); | ||||
| 
 | ||||
| 			this.connection.on('invited', this.onInvited); | ||||
| 
 | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import XNotes from './notes.vue'; | ||||
| import * as os from '@client/os'; | ||||
| import * as sound from '@client/scripts/sound'; | ||||
|  | @ -121,33 +121,33 @@ export default defineComponent({ | |||
| 			this.query = { | ||||
| 				antennaId: this.antenna | ||||
| 			}; | ||||
| 			this.connection = os.stream.useChannel('antenna', { | ||||
| 			this.connection = markRaw(os.stream.useChannel('antenna', { | ||||
| 				antennaId: this.antenna | ||||
| 			}); | ||||
| 			})); | ||||
| 			this.connection.on('note', prepend); | ||||
| 		} else if (this.src == 'home') { | ||||
| 			endpoint = 'notes/timeline'; | ||||
| 			this.connection = os.stream.useChannel('homeTimeline'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('homeTimeline')); | ||||
| 			this.connection.on('note', prepend); | ||||
| 
 | ||||
| 			this.connection2 = os.stream.useChannel('main'); | ||||
| 			this.connection2 = markRaw(os.stream.useChannel('main')); | ||||
| 			this.connection2.on('follow', onChangeFollowing); | ||||
| 			this.connection2.on('unfollow', onChangeFollowing); | ||||
| 		} else if (this.src == 'local') { | ||||
| 			endpoint = 'notes/local-timeline'; | ||||
| 			this.connection = os.stream.useChannel('localTimeline'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('localTimeline')); | ||||
| 			this.connection.on('note', prepend); | ||||
| 		} else if (this.src == 'social') { | ||||
| 			endpoint = 'notes/hybrid-timeline'; | ||||
| 			this.connection = os.stream.useChannel('hybridTimeline'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('hybridTimeline')); | ||||
| 			this.connection.on('note', prepend); | ||||
| 		} else if (this.src == 'global') { | ||||
| 			endpoint = 'notes/global-timeline'; | ||||
| 			this.connection = os.stream.useChannel('globalTimeline'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('globalTimeline')); | ||||
| 			this.connection.on('note', prepend); | ||||
| 		} else if (this.src == 'mentions') { | ||||
| 			endpoint = 'notes/mentions'; | ||||
| 			this.connection = os.stream.useChannel('main'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('main')); | ||||
| 			this.connection.on('mention', prepend); | ||||
| 		} else if (this.src == 'directs') { | ||||
| 			endpoint = 'notes/mentions'; | ||||
|  | @ -159,16 +159,16 @@ export default defineComponent({ | |||
| 					prepend(note); | ||||
| 				} | ||||
| 			}; | ||||
| 			this.connection = os.stream.useChannel('main'); | ||||
| 			this.connection = markRaw(os.stream.useChannel('main')); | ||||
| 			this.connection.on('mention', onNote); | ||||
| 		} else if (this.src == 'list') { | ||||
| 			endpoint = 'notes/user-list-timeline'; | ||||
| 			this.query = { | ||||
| 				listId: this.list | ||||
| 			}; | ||||
| 			this.connection = os.stream.useChannel('userList', { | ||||
| 			this.connection = markRaw(os.stream.useChannel('userList', { | ||||
| 				listId: this.list | ||||
| 			}); | ||||
| 			})); | ||||
| 			this.connection.on('note', prepend); | ||||
| 			this.connection.on('userAdded', onUserAdded); | ||||
| 			this.connection.on('userRemoved', onUserRemoved); | ||||
|  | @ -178,9 +178,9 @@ export default defineComponent({ | |||
| 			this.query = { | ||||
| 				channelId: this.channel | ||||
| 			}; | ||||
| 			this.connection = os.stream.useChannel('channel', { | ||||
| 			this.connection = markRaw(os.stream.useChannel('channel', { | ||||
| 				channelId: this.channel | ||||
| 			}); | ||||
| 			})); | ||||
| 			this.connection.on('note', prepend); | ||||
| 			this.connection.on('typers', typers => { | ||||
| 				this.typers = this.$i ? typers.filter(u => u.id !== this.$i.id) : typers; | ||||
|  |  | |||
|  | @ -46,7 +46,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import define from './define'; | ||||
| import * as os from '@client/os'; | ||||
| import number from '@client/filters/number'; | ||||
|  | @ -65,7 +65,7 @@ export default defineComponent({ | |||
| 	extends: widget, | ||||
| 	data() { | ||||
| 		return { | ||||
| 			connection: os.stream.useChannel('queueStats'), | ||||
| 			connection: markRaw(os.stream.useChannel('queueStats')), | ||||
| 			inbox: { | ||||
| 				activeSincePrevTick: 0, | ||||
| 				active: 0, | ||||
|  |  | |||
|  | @ -15,7 +15,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import MkContainer from '@client/components/ui/container.vue'; | ||||
| import define from './define'; | ||||
| import { getStaticImageUrl } from '@client/scripts/get-static-image-url'; | ||||
|  | @ -48,7 +48,7 @@ export default defineComponent({ | |||
| 		}; | ||||
| 	}, | ||||
| 	mounted() { | ||||
| 		this.connection = os.stream.useChannel('main'); | ||||
| 		this.connection = markRaw(os.stream.useChannel('main')); | ||||
| 
 | ||||
| 		this.connection.on('driveFileCreated', this.onDriveFileCreated); | ||||
| 
 | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ | |||
| </template> | ||||
| 
 | ||||
| <script lang="ts"> | ||||
| import { defineComponent } from 'vue'; | ||||
| import { defineComponent, markRaw } from 'vue'; | ||||
| import define from '../define'; | ||||
| import MkContainer from '@client/components/ui/container.vue'; | ||||
| import XCpuMemory from './cpu-mem.vue'; | ||||
|  | @ -63,7 +63,7 @@ export default defineComponent({ | |||
| 		os.api('server-info', {}).then(res => { | ||||
| 			this.meta = res; | ||||
| 		}); | ||||
| 		this.connection = os.stream.useChannel('serverStats'); | ||||
| 		this.connection = markRaw(os.stream.useChannel('serverStats')); | ||||
| 	}, | ||||
| 	unmounted() { | ||||
| 		this.connection.dispose(); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue