Closed notwo closed 1 year ago
typescriptのStructural SubtypingについてはTypescript の Structural Subtypingを参照
Genericsについては【TypeScript】Generics(ジェネリックス)を理解するを参照
VueJS+TypeScriptについては[【2021年版】Vue.js + TypeScriptの開発スタイル](https://tech-blog.rakus.co.jp/entry/20210901/frontend)を参照 本件ではObject Styleで書くことになりそう
よくチュートリアルで実行させるコマンドnpm init vue@latest
はサーバ側での処理を含めたプロジェクトを生成するものであり、そこで構成されるディレクトリはmustではなく、あくまで見やすくするためにそうしているだけ
→自分で個別にVueファイル等を使う場合はこのディレクトリ構成に従う必要はない。
→→ただし後で見てわかりやすいようにcomponents等は専用のディレクトリを用意してそこに配置すべきだとは思う
また、チュートリアルではよくnpm run dev
でサーバを立ち上げてVueJSのトップ画面を表示している。一見VueJSがまるでサーバ開発言語のように見えるが、実際にはただのJSフレームワークであり、これ自体がサーバ上で動く言語とは言えないはず。どっちかと言うとNode.jsがそれの役割を担っていて(npmコマンドがその証拠)、Node.jsとAWS Lambdaでサーバレスアプリを作成できる。
AltJSについて AltJSの選び方フローチャート VueJSを形作っているTypeScriptも、AltJSの一つ
Viteとは何なのかを参照 高速ビルドが可能な次世代ビルドツールらしい
参考:Vue3とViteで作られた初期状態のサイト↓
JSの記述の中でHTMLを記述できる ぶっちゃけ使わなくても良さげ
Django(Python)ならPyCharm1択なんだが、さすがにJSやCSSの記述はVSCodeに軍配が上がる というわけで、JS/CSSはVSCode、それ以外はPyCharmを使う。同時に立ち上げてPCの負荷が酷いことになるとは思えないので。
VueJS学習がめんどすぎるので愚痴った でも記事書きながら調べたりしたおかげでちょっと頭の中が整理された✌
CDNを利用する場合とcreate-vueで作成する場合でビルド方法が異なる。本サービスは前者想定のためViteは使わない
vue/dist/vue.esm.js って何~【とりあえず動くからいいや】からの卒業~を参照 紹介されてるコードはなんとなくVue2の書き方っぽいけど、概念は変わっていないだろうからそのまま信用して良さそう esmは完全ビルドを指す
ランタイムビルドのみの方が速いが、本サービスでは全体のコード量が多くなるわけでもなさそうなので、ぶっちゃけどっちもでいい。書きやすい方に合わせるのが吉
単一ファイルコンポーネントというらしい .vueの拡張子がついてるやつがそう これはそのままでは.tsと違いTypecriptファイルとみなされない それを解決するのがshims-vue.d.tsというファイル(参考:TypeScriptでVue.jsを書く – Vue CLIを使った開発のポイントを紹介)
Vue.js開発で役に立つVSCode拡張機能を元に拡張機能を入れる
npmまとめ!を参照 ローカルインストールとグローバルインストールがある 現状は以下のようになっている
$ npm list
youknow@1.0.0 C:\Users\07k11\Desktop\work\youknow
└── typescript@5.1.6
$ npm list -g
C:\Users\07k11\AppData\Roaming\npm
└── npm@9.8.1
npm initから作ったスケルトンは以下
$ npm ls
vue-ts-test@0.0.0 C:\Users\07k11\Desktop\work\vue-ts-test
├── @vitejs/plugin-vue@4.2.3
├── eslint-plugin-vue@9.16.1
├── eslint@8.46.0
├── vite@4.4.8
└── vue@3.3.4
$ npm ls -g
C:\Users\07k11\AppData\Roaming\npm
└── npm@9.8.1
どちらも必要なパッケージをローカルインストールしている。node_modulesはルートディレクトリにあるし
Vue.jsのインストール(ダウンロード・NPM・CDN)を参照 本件ではCDN形式を取っている。チュートリアルだとnpm前提のものが多すぎてCDNだと開発しづらい問題 TypeScriptも使うんだから結局npmは必要なんだけど、VueJSもそっちで使えばよかったか? →CDN経由でうまくいかないならnpm installしてpackage.jsonに含めるかもしれない
CDNだとSFCが使えないって書いてあったわ^^^^^^^^^^^^^^
というわけで…
Vue.js3でSFC(単一ファイルコンポーネント)を使う環境の構築を元に環境構築
# ルートディレクトリで
$ npm install vue@next
npm WARN deprecated sourcemap-codec@1.4.8: Please use @jridgewell/sourcemap-codec instead
added 21 packages, and audited 23 packages in 4s
2 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
$ npm install @vue/compiler-sfc
added 10 packages, changed 3 packages, and audited 33 packages in 1s
2 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
$ npm install vue-style-loader
added 7 packages, and audited 40 packages in 1s
3 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
$ npm install vue-loader@16.1.2
added 10 packages, and audited 50 packages in 2s
5 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
# モジュールが入ったか確認
$ cat package.json
{
"name": "youknow",
"version": "1.0.0",
"description": "記法は[基本的な書き方とフォーマットの構文](https://docs.github.com/ja/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax)に従う\r ___",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"devDependencies": {
"typescript": "^5.1.6"
},
"dependencies": {
"@vue/compiler-sfc": "^3.3.4",
"vue": "^3.2.36",
"vue-loader": "^16.1.2",
"vue-style-loader": "^4.1.3"
}
}
$ npm list
youknow@1.0.0 C:\Users\07k11\Desktop\work\youknow
├── @vue/compiler-sfc@3.3.4
├── typescript@5.1.6
├── vue-loader@16.1.2
├── vue-style-loader@4.1.3
└── vue@3.2.36
$ npm list -g
C:\Users\07k11\AppData\Roaming\npm
└── npm@9.8.1
package.jsonなどの位置を変えてある程度は解消した
you_know/static/you_know/js/
├──node_modules/
├──package.json
├──package-lock.json
├──shims-vue.d.ts
├──src/
├────library/
├──────app.vue
├──────index.js
├──────index.ts
それに伴ってnpx tscをjs/以下でないと実行できなくなった→build.shにも反映しないとだめそう
~/Desktop/work/youknow (you_know_28)
$ you_know/static/you_know/js/npx tsc
bash: you_know/static/you_know/js/npx: No such file or directory
cd you_know/static/you_know/js
npx tsc
この時点で以下のようなエラー
src/library/index.ts(1,27): error TS2792: Cannot find module 'vue'. Did you mean to set the 'moduleResolution' option to 'nodenext', or to add aliases to the 'paths' option?
調査してtsconfig.jsonを修正
"target": "ES2015", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
...
//"module": "commonjs", /* Specify what module code is generated. */
...
"moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
その後runserverすると以下エラー
Cannot use import statement outside a module
これは訳わかんねえから調査中
スケルトンvueプロジェクトにもtsを入れてみたので、こっちで問題なく動作するならスケルトンをお手本にして修正できるかもしれない
因みに、VSCode上でVueJS開発をしていると、実際にはエラーじゃないのにコード上にCan't find module 'vue'とか出るけど無視でいい。コンソールにその内容のエラーは出ない
"target": "ES5", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
"module": "ES2015", /* Specify what module code is generated. */
"moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
declare module "*.vue" {
import { defineComponent } from "vue";
const component: ReturnType<typeof defineComponent>;
export default component;
}
scriptタグにtype="module"
をつければ解決
今度はrunserver後に別のエラー
Uncaught TypeError: Failed to resolve module specifier "vue". Relative references must start with either "/", "./", or "../".
スケルトン同様にviteをビルドツールとして入れても変わらず
上記をyou_know仕様書にまとめる
vue.config.js設定ファイルについてで解説されている VueJSのビルドはこれで設定した通りに行う
なのだが、Vite×Vue3で詰まったところを見るにvite.config.jsで巻き取れそうなのでそっちを使っていきたい
データ操作部分(ライブラリ等)については共通ヘッダ、フッタ含め全画面をSPAで制作する よってフロントエンド開発はVSCodeで行い、you_know_vue上で開発をする ターミナルもVSCodeで完結させる→無理そうならitermとかでいい こちらはnpm run devとかして表示を確認する
一方でバックエンドでAPI開発をする際はPYCharmを用いてyou_know/以下で行う フロントエンドとは別窓でやった方がいい こちらはrunserverしてデバッグを行う
実際に画面出力されるフォームを元にhtmlを組み、forms.pyのフォーム自体は使わない データ操作部分はview部分を完全にフロントエンド特化したいので、templates/以下にはビルド成果物のindex.html以外は置かない前提で考える
導入完了し、全体の方針がまとまったのでclose
TypeScript同様にわからないことが多いのでここにまとめていく コードレベルで何かやるわけではないのでプルリクなし
VueJSについて
簡単な例で始めるVue3でTypeScript入門にある通りVueJSはVue3を基本とし、TypeScript記述が基本となる これまでのVueJSや研修時点での知識がそのまま使えるか怪しいため、ある程度体系化して書き方を整理する必要がある
全体の作りとしてはvue/dist/vue.esm.js って何~【とりあえず動くからいいや】からの卒業~に倣ってhtml, js, vueを分けて書くのが良い