Closed39

Nuxt.jsからNext.jsに移行中

tmtk75tmtk75

2016年ごろ触れた感じだとJSXとredux-sagaがどうしても好きになれなくて代わりにVue/Nuxt.jsを選んだ。が、結局JSXが使いたくなってNuxtから切り替えることにした。
Next.js, Recoil, Immer, Emotion辺りを試している。UIは無難にMaterial-UI。Nuxtの頃はVuetify使ってた。

tmtk75tmtk75

Nuxtで使っていたlibrary その1

  • PouchDB: NoSQL。同期が簡単にできてよかった。
  • dayjs: 日付扱うならほぼde factoか。
  • fuse.js: fuzzy searching
  • hotkeys-js: keyboard shortcut
  • lunr: full text search(日本語弱い)
  • showdown: Markdown parser
  • ulid: "Universally Unique Lexicographically Sortable Identifier" だって。
tmtk75tmtk75

vuexは使ってなかった。composition-api使ってrecoilと同じようなことしてた。

そのおかげでReact Hooksにもすぐ慣れられた。

tmtk75tmtk75

Immerで上と下って挙動違うのね。

produce((draft) => { draft.unshift(something) })
produce((draft) => draft.unshift(something))
tmtk75tmtk75

なんでこのwarningになるかは分からないんだけど、

VM31640:37 Warning: React does not recognize the `backgroundColor` prop on a DOM element. If you intentionally want it to appear in the DOM as a custom attribute, spell it as lowercase `backgroundcolor` instead. If you accidentally passed it from a parent component, remove it from the DOM element.

defaultValueを使うようにしたら出なくなった。

-              value={title}
+              defaultValue={title}
tmtk75tmtk75

次はこれ。

Warning: A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component

undefined to a defined value,

アッハイ。

useState(s || "")としてやったら出なくなりました。

tmtk75tmtk75

globalの宣言が変わったみたいだな。globalThisだけになった。

diff --git a/app/electron-src/preload.ts b/app/electron-src/preload.ts
index 88aa70f..8ecf2b5 100644
--- a/app/electron-src/preload.ts
+++ b/app/electron-src/preload.ts
@@ -1,18 +1,14 @@
 /* eslint-disable @typescript-eslint/no-namespace */
 // eslint-disable-next-line @typescript-eslint/no-unused-vars
-import { ipcRenderer, IpcRenderer } from 'electron'
+import { ipcRenderer, IpcRenderer } from "electron";

 declare global {
-  namespace NodeJS {
-    interface Global {
-      ipcRenderer: IpcRenderer
-    }
-  }
+  var ipcRenderer: IpcRenderer;
 }
tmtk75tmtk75

Error: Rendered more hooks than during the previous render.

ほほう?

ああ、なるほど、hook呼ぶ前にretrunするなってことね。

tmtk75tmtk75

package化したらloadURLで何も表示できなくなる問題にここ数日ぶち当たってた。
解決してみたらなんのことはない、必要な環境変数が.env.development.localでのみ宣言されていて、productionビルドでは定義されていないことが原因だった。とりあえず.env.production.localを作ってやったら無事動いた。

SPA + Auth0 client-sideとElectron + Auth0が同じbuildで動くようにできた。
nuxtのときよりもスマートにできて満足。

tmtk75tmtk75

macのサブ機のVSCodeで、定義へのjump(go to definition)がcmd + clickaltにしたくて困ってたんだけど、Editor: Multi Cursor Modifieraltになってたせいだった。これをctrlCmdにしたらalt + clickでgo to definitionの動きをするようになった。

tmtk75tmtk75

ふむ。

 npx @mui/codemod v5.0.0/jss-to-styled ./renderer/components/templates/
tmtk75tmtk75

Warning: Expected server HTML to contain a matching <ul> in <div>.

reload時に毎回出るこのwarningがやっと直せた。
_app.tsxでwindowがないときに空のfragmentを返すようにしてたんだけど、そのせいだった。
これで直ったわ。

@@ -28,7 +28,11 @@ export default function MyApp({ Component, pageProps }: AppProps) {
   }, []);

   if (!(typeof window !== "undefined")) {
-    return <></>;
+    return (
+      <RecoilRoot>
+        <Component {...pageProps} />
+      </RecoilRoot>
+    );
   }
tmtk75tmtk75

そういえばMUI v4からMUI v5へ移行したんだけど、移行時の修正で一番困ったのがuseAutocompleteが返すgroupedOptionsの型が変わったことだったな。

: groupedOptions: T[] | Array<AutocompleteGroupedOption<T>>: groupedOptions: T[]

とりあえずas T[]として型だけ一致させたけど。


AutocompleterenderOptionの仕様変わってたわ。optionクリックしても選択されなかった。
ここの通りに直したら期待通り動いた。
Breaking changeがちゃんと書いてあるのいい。
https://mui.com/guides/migration-v4/#autocomplete

tmtk75tmtk75

MDXだと<URL>の表記ができないんだな。まあしょうがないか。

tmtk75tmtk75

MDXでrenderingを試して、失敗したらfallbackとしてMarkdownとしてrenderingするようにしてみた。
いい感じ。

tmtk75tmtk75

PouchDBのforce putハマった...
同じrevision numberだとrevisionの文字列のdictionary orderで新旧が決まるのね...

tmtk75tmtk75

MUIのThem interface、補完で2つ出てくるけど下が上を継承してんのね。

import { Theme } from "@mui/system";
import { Theme } from "@mui/material/styles";
tmtk75tmtk75

callbackをpropertyとして受け取+一回だけ初期化のケースはreactだと気をつける必要があるんだな。
callbackがclosureでbindしてる変数が最新じゃないってのでハマった。

tmtk75tmtk75

大した量のテキストでもないのにmonaco-editorのCTRL + Aでの全選択がどうもワンテンポ遅い(押してから数百ミリ秒くらいつまる)感があって何故かと思ってたんだけど、その理由がさっき分かった。
プロポーショナルフォントのせいだった。面白い。

tmtk75tmtk75

あるTypeScriptのコードを書くとVSCodeのlang-serverがcrash(?)する事象に遭遇。

unifiedのtransformer plugin絡みなんだけど、visitのvisitorの関数をanonymous funcで書いたときに3rd argをつけると再現する。さてどう回避しようかな。

import { visit } from "unist-util-visit";
...
export function fooPlugin(): unified.Transformer<hast.Root, hast.Root> {
    ...
    visit(w, "element", (node: any, index, parent /* これ */) => {

visitの型推論が動くと壊れるっぽいな...。

tmtk75tmtk75

移行自体はとっくに終わってるので閉じるか。

このスクラップは2022/05/04にクローズされました