Nuxt.jsからNext.jsに移行中
2016年ごろ触れた感じだとJSXとredux-sagaがどうしても好きになれなくて代わりにVue/Nuxt.jsを選んだ。が、結局JSXが使いたくなってNuxtから切り替えることにした。
Next.js, Recoil, Immer, Emotion辺りを試している。UIは無難にMaterial-UI。Nuxtの頃はVuetify使ってた。
Monaco editorのReact componentがあって超助かった。
Nuxtのときは自分で書いてた。
Electronでデスクトップアプリ化していた。
Nextにはそのままずばりのひな形があってこれも助かった。
ちなみにNext.jsへの初pull requestはこれ。
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" だって。
vuexは使ってなかった。composition-api使ってrecoilと同じようなことしてた。
そのおかげでReact Hooksにもすぐ慣れられた。
Immerで上と下って挙動違うのね。
produce((draft) => { draft.unshift(something) })
produce((draft) => draft.unshift(something))
useEffect忘れがち。
Next.js + Material-UIはそのままだとLinkの扱いが相性悪いので以下のforwardRefが必要。
なんでこの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}
次はこれ。
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 || "")
としてやったら出なくなりました。
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;
}
まだvalue
とdefaultValue
に慣れない。
なるほど、Comlinkね。
Error: Rendered more hooks than during the previous render.
ほほう?
ああ、なるほど、hook呼ぶ前にretrunするなってことね。
認証部分の移植中。
この記事が参考になった。
ありがとうございました https://zenn.dev/eringiv3/scraps/daa94fc864025e
package化したらloadURLで何も表示できなくなる問題にここ数日ぶち当たってた。
解決してみたらなんのことはない、必要な環境変数が.env.development.local
でのみ宣言されていて、productionビルドでは定義されていないことが原因だった。とりあえず.env.production.local
を作ってやったら無事動いた。
SPA + Auth0 client-sideとElectron + Auth0が同じbuildで動くようにできた。
nuxtのときよりもスマートにできて満足。
macのサブ機のVSCodeで、定義へのjump(go to definition)がcmd + click
でalt
にしたくて困ってたんだけど、Editor: Multi Cursor Modifier
がalt
になってたせいだった。これをctrlCmd
にしたらalt + click
でgo to definitionの動きをするようになった。
仕事がめっちゃ忙しくて全然これの時間がとれなかった。
やっと時間がとれたのでversionを表示するところを修正中。
vercel or othersで表示する値を切り替える必要があるかね。
Next.js + TypeScript + Jest.
ここ見て設定できました。
- https://zenn.dev/garypippi/articles/c79cb002e001681a73cd
- https://qiita.com/mame_daifuku/items/79b6a5a1514a3f067e1a
/**
* @jest-environment jsdom
*/
ふむ。
npx @mui/codemod v5.0.0/jss-to-styled ./renderer/components/templates/
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>
+ );
}
そろそろCode Signingもちゃんと考えるか。
実験はこれかな?
NextAuthでdropboxのアクセストークンをとるのに参考にした。
アプリはMUI、Webサイトはtailwindを使ってみる。
導入にはここを参考にさせてもらいました。
next.jsで.svg表示。
私が使ってるAffinity Designerで出力するとstyle
にpropertyが文字列で入ってるのでそのままコピペじゃReactで都合が悪い。
- svgr: https://zenn.dev/catnose99/articles/49c12f84182bdf
- styleを無理矢理propertyに: https://stackoverflow.com/questions/61118266/how-to-convert-svg-style-to-jsx
数が少なければ後者でもいいかもな。
そういえばMUI v4からMUI v5へ移行したんだけど、移行時の修正で一番困ったのがuseAutocompleteが返すgroupedOptionsの型が変わったことだったな。
新: groupedOptions: T[] | Array<AutocompleteGroupedOption<T>>
旧: groupedOptions: T[]
とりあえずas T[]
として型だけ一致させたけど。
Autocomplete
もrenderOption
の仕様変わってたわ。optionクリックしても選択されなかった。
ここの通りに直したら期待通り動いた。
Breaking changeがちゃんと書いてあるのいい。
GitHub Actions、Environmentsってあるのか。知らなかった。
めっちゃはまった。
Secretsに登録しただけじゃ参照できないの忘れてた。
MDXだと<URL>の表記ができないんだな。まあしょうがないか。
MDXでrenderingを試して、失敗したらfallbackとしてMarkdownとしてrenderingするようにしてみた。
いい感じ。
next-auth v4でdropbox providerでの認証ができないな。
v3 -> v4にしただけで他は変えてないからversion差違しかないはずなんだけど。
ここで報告した。再現したようだけどまだ解決はしてないみたいね。
PouchDBのforce putハマった...
同じrevision numberだとrevisionの文字列のdictionary orderで新旧が決まるのね...
MUIのThem interface、補完で2つ出てくるけど下が上を継承してんのね。
import { Theme } from "@mui/system";
import { Theme } from "@mui/material/styles";
fs.watch
callbackをpropertyとして受け取+一回だけ初期化のケースはreactだと気をつける必要があるんだな。
callbackがclosureでbindしてる変数が最新じゃないってのでハマった。
大した量のテキストでもないのにmonaco-editorのCTRL + Aでの全選択がどうもワンテンポ遅い(押してから数百ミリ秒くらいつまる)感があって何故かと思ってたんだけど、その理由がさっき分かった。
プロポーショナルフォントのせいだった。面白い。
<a>に属性足したくてunifiedのvisitとか見てるんだけど、この辺使うっぽいな。
ある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の型推論が動くと壊れるっぽいな...。
移行自体はとっくに終わってるので閉じるか。