Skip to content

Commit

Permalink
perf: tree-shake dependencies from server (#1647)
Browse files Browse the repository at this point in the history
  • Loading branch information
danielroe authored Feb 6, 2023
1 parent 357dff2 commit 6dc38c7
Show file tree
Hide file tree
Showing 12 changed files with 91 additions and 20 deletions.
2 changes: 2 additions & 0 deletions components/common/CommonInputImage.vue
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ const previewImage = ref('')
const imageSrc = computed<string>(() => previewImage.value || defaultImage.value)
const pickImage = async () => {
if (process.server)
return
const image = await fileOpen({
description: 'Image',
mimeTypes: props.allowedFileTypes,
Expand Down
2 changes: 1 addition & 1 deletion components/modal/ModalMediaPreviewCarousel.vue
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const { modelValue } = defineModel<{
const target = ref()
const animateTimeout = useTimeout(10)
const reduceMotion = useReducedMotion()
const reduceMotion = process.server ? ref(false) : useReducedMotion()
const canAnimate = computed(() => !reduceMotion.value && animateTimeout.value)
Expand Down
3 changes: 3 additions & 0 deletions components/tiptap/TiptapEmojiList.vue
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ const { items, command } = defineProps<{
}>()
const emojis = computed(() => {
if (process.server)
return []
return items.map((item: CustomEmoji | Emoji) => {
if (isCustomEmoji(item)) {
return {
Expand Down
2 changes: 2 additions & 0 deletions composables/masto/publish.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,8 @@ export function useUploadMediaAttachment(draftRef: Ref<Draft>) {
}

async function pickAttachments() {
if (process.server)
return
const mimeTypes = currentInstance.value!.configuration?.mediaAttachments.supportedMimeTypes
const files = await fileOpen({
description: 'Attachments',
Expand Down
4 changes: 4 additions & 0 deletions composables/tiptap.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { Editor } from '@tiptap/vue-3'
import { Extension, useEditor } from '@tiptap/vue-3'
import Placeholder from '@tiptap/extension-placeholder'
import Document from '@tiptap/extension-document'
Expand Down Expand Up @@ -27,6 +28,9 @@ export interface UseTiptapOptions {
}

export function useTiptap(options: UseTiptapOptions) {
if (process.server)
return { editor: ref<Editor | undefined>() }

const {
autofocus,
content,
Expand Down
28 changes: 15 additions & 13 deletions composables/tiptap/suggestion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,20 @@ export { Emoji }
export type CustomEmoji = (mastodon.v1.CustomEmoji & { custom: true })
export const isCustomEmoji = (emoji: CustomEmoji | Emoji): emoji is CustomEmoji => !!(emoji as CustomEmoji).custom

export const TiptapMentionSuggestion: Partial<SuggestionOptions> = {
pluginKey: new PluginKey('mention'),
char: '@',
async items({ query }) {
if (query.length === 0)
return []

const results = await useMastoClient().v2.search({ q: query, type: 'accounts', limit: 25, resolve: true })
return results.accounts
},
render: createSuggestionRenderer(TiptapMentionList),
}
export const TiptapMentionSuggestion: Partial<SuggestionOptions> = process.server
? {}
: {
pluginKey: new PluginKey('mention'),
char: '@',
async items({ query }) {
if (query.length === 0)
return []

const results = await useMastoClient().v2.search({ q: query, type: 'accounts', limit: 25, resolve: true })
return results.accounts
},
render: createSuggestionRenderer(TiptapMentionList),
}

export const TiptapHashtagSuggestion: Partial<SuggestionOptions> = {
pluginKey: new PluginKey('hashtag'),
Expand All @@ -52,7 +54,7 @@ export const TiptapEmojiSuggestion: Partial<SuggestionOptions> = {
pluginKey: new PluginKey('emoji'),
char: ':',
async items({ query }): Promise<(CustomEmoji | Emoji)[]> {
if (query.length === 0)
if (process.server || query.length === 0)
return []

if (currentCustomEmojis.value.emojis.length === 0)
Expand Down
6 changes: 3 additions & 3 deletions composables/users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import { useAsyncIDBKeyval } from '~/composables/idb'

const mock = process.mock

const initializeUsers = async (): Promise<Ref<UserLogin[]> | RemovableRef<UserLogin[]>> => {
const initializeUsers = (): Promise<Ref<UserLogin[]> | RemovableRef<UserLogin[]>> | Ref<UserLogin[]> | RemovableRef<UserLogin[]> => {
let defaultUsers = mock ? [mock.user] : []

// Backward compatibility with localStorage
Expand All @@ -34,15 +34,15 @@ const initializeUsers = async (): Promise<Ref<UserLogin[]> | RemovableRef<UserLo

const users = process.server
? ref<UserLogin[]>(defaultUsers)
: await useAsyncIDBKeyval<UserLogin[]>(STORAGE_KEY_USERS, defaultUsers, { deep: true })
: useAsyncIDBKeyval<UserLogin[]>(STORAGE_KEY_USERS, defaultUsers, { deep: true })

if (removeUsersOnLocalStorage)
globalThis.localStorage.removeItem(STORAGE_KEY_USERS)

return users
}

const users = await initializeUsers()
const users = process.server ? initializeUsers() as Ref<UserLogin[]> | RemovableRef<UserLogin[]> : await initializeUsers()
const nodes = useLocalStorage<Record<string, any>>(STORAGE_KEY_NODES, {}, { deep: true })
const currentUserHandle = useLocalStorage<string>(STORAGE_KEY_CURRENT_USER_HANDLE, mock ? mock.user.account.id : '')
export const instanceStorage = useLocalStorage<Record<string, mastodon.v1.Instance>>(STORAGE_KEY_SERVERS, mock ? mock.server : {}, { deep: true })
Expand Down
3 changes: 3 additions & 0 deletions mocks/class.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default class SomeClass {

}
8 changes: 8 additions & 0 deletions mocks/prosemirror.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import proxy from 'unenv/runtime/mock/proxy'

export const Plugin = proxy
export const PluginKey = proxy
export const Decoration = proxy
export const DecorationSet = proxy

export { proxy as default }
17 changes: 17 additions & 0 deletions mocks/tiptap.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import proxy from 'unenv/runtime/mock/proxy'

export const Extension = proxy
export const useEditor = proxy
export const EditorContent = proxy
export const NodeViewContent = proxy
export const NodeViewWrapper = proxy
export const nodeViewProps = proxy
export const Node = proxy
export const mergeAttributes = proxy
export const nodeInputRule = proxy
export const nodePasteRule = proxy
export const VueNodeViewRenderer = proxy
export const findChildren = proxy
export const VueRenderer = proxy

export { proxy as default }
31 changes: 28 additions & 3 deletions nuxt.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -128,10 +128,10 @@ export default defineNuxtConfig({
},
},
},
build: {
transpile: ['masto'],
},
nitro: {
alias: {
'isomorphic-ws': 'unenv/runtime/mock/proxy',
},
esbuild: {
options: {
target: 'esnext',
Expand All @@ -143,12 +143,37 @@ export default defineNuxtConfig({
ignore: ['/settings'],
},
},
sourcemap: !isDevelopment,
hooks: {
'nitro:config': function (config) {
const nuxt = useNuxt()
config.virtual = config.virtual || {}
config.virtual['#storage-config'] = `export const driver = ${JSON.stringify(nuxt.options.appConfig.storage.driver)}`
},
'vite:extendConfig': function (config, { isServer }) {
if (isServer) {
const alias = config.resolve!.alias as Record<string, string>
for (const dep of ['eventemitter3', 'isomorphic-ws'])
alias[dep] = resolve('./mocks/class')
for (const dep of ['shiki-es', 'fuse.js'])
alias[dep] = 'unenv/runtime/mock/proxy'
const resolver = createResolver(import.meta.url)

config.plugins!.unshift({
name: 'mock',
enforce: 'pre',
resolveId(id) {
if (id.match(/(^|\/)(@tiptap)\//))
return resolver.resolve('./mocks/tiptap.ts')
if (id.match(/(^|\/)(prosemirror)/))
return resolver.resolve('./mocks/prosemirror.ts')
},
})

const noExternal = config.ssr!.noExternal as string[]
noExternal.push('masto', '@fnando/sparkline', 'vue-i18n', '@mastojs/ponyfills')
}
},
},
app: {
keepalive: true,
Expand Down
5 changes: 5 additions & 0 deletions pages/settings/users/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@ useHeadFixed({
const loggedInUsers = useUsers()
async function exportTokens() {
if (process.server)
return
if (!confirm('Please aware that the tokens represent the **full access** to your accounts, and should be treated as sensitive information. Are you sure you want to export the tokens?'))
return
Expand All @@ -28,6 +31,8 @@ async function exportTokens() {
}
async function importTokens() {
if (process.server)
return
const file = await fileOpen({
description: 'Token File',
mimeTypes: ['application/json'],
Expand Down

0 comments on commit 6dc38c7

Please sign in to comment.