目次
なんとも大変なwebpackとtsの設定ファイル
今回初めて、TypeScriptとVueを一緒に使ってみようと思い立ち、設定をしてみたのですが、まぁこれが大変でした。
自分自身がフロントエンド周りに疎いということもありますが、色々出てくる情報を参考にしても、versionが合ってないことが多々あり、エラーで引っかかるということが多くありました。
今回の自分の環境
node 12.0.0 npm 6.9.0 webpack 5.24.2 webpack-cli 4.5.0 typescript 4.2.2 vue 2.6.12
package.jsonの設定
まずはnpm installする際のpackage.jsonを設定します。とりあえず、最低限だけ記載しておきます。
{ "name": "", "version": "1.0.0", "scripts": { "build": "webpack", "watch": "webpack -w" }, "browser": { "vue": "vue/dist/vue.common.js" }, "type": "module", "license": "ISC", "dependencies": { "vue": "^2.6.12" }, "devDependencies": { "typescript": "^4.2.2", "ts-loader": "^8.0.17", "webpack": "^5.24.2", "webpack-cli": "^4.5.0" } }
webpack.config.jsの設定
続いて、webpack.config.jsの中身。webpackを使用するのに必要です。
const path = require('path'); const glob = require("glob"); const dir = path.resolve(__dirname, "proj/assets/ts") const entries = glob .sync("**/*.ts", { cwd: dir }) .map(function (key) { return [key.replace(/\.(ts|tsx)/g, ''), path.resolve(dir, key)]; }); module.exports = { mode: "development", entry: Object.fromEntries(entries), output: { filename: '[name].bundle.js', path: `${__dirname}/proj/static/js/dist` }, module: { rules: [ { test: /\.ts$/, use: "ts-loader" } ] }, resolve: { extensions: ['.js', '.vue', '.json', '.ts'], alias: { vue: "vue/dist/vue.common.js" } }, target: ["web", "es5"], };
ポイント1. entryを各ファイル毎に分ける
entryにコンパイルしたいtsファイルへのパスを通すのですが、割と多かったのが以下のような書き方で、ファイルを一つに纏めてしまうというやり方でした。
const entries = glob.sync(path.resolve(__dirname, "proj/assets/ts/**/*.ts"));
もちろん、このやり方でも良いのですが、自分は出力ファイルを分けたかったので、上記のような設定にしたのですが、この書き方が分からずに大分ハマりました。
ポイント2. resolveのaliasにvueのパスを通す
こちら、色々な例が出ていまして、vue$: とするだとか、node_modules/vue/dist/vue.common.js とするだとか、色々あり、どれで試しても特にエラーなどが出ない為に、非常に混乱しました。。
結果として、vue: “vue/dist/vue.common.js” に落ち着きました。
tsconfig.jsonの設定
最後に、tsconfig.jsonの中身。TypeScriptをコンパイルする際のオプション。
そもそも、元々、自分はこのファイルが必要なのか分からなかったです。。最初gulpを使って、そちらにオプションを書いていたというのもあったのですが、ずっとこのファイルがなくても、コンパイルエラーにもならないし、何が問題なのか分からずで、このファイルを後から追加してみたという感じでした。
{ "compilerOptions": { "sourceMap": true, "target": "es5", "module": "es2015", "lib": [ "dom", "es2020" ], "moduleResolution": "node", "allowSyntheticDefaultImports": true, "experimentalDecorators": true, "emitDecoratorMetadata": true } }
ポイント. moduleResolutionの設定
自分の中でのポイントはmoduleResolutionにnodeを設定するということです。意外とこれが書かれている参考ページがなくて、node_modulesの中身が読めていないようでした。
以上で、とりあえずTypeScriptとVueのファイルをコンパイルすることに成功し、動かすことが出来ました!
上記のファイルに加えて、nodeのversionもかなり重要だと思います。他versionでは通らないかもしれないので、十分注意してください。
node周りはversionが合ってないと全然通らないということが結構あって、かなり大変ですね。。
自分自身でもちゃんと使っているもののversionを記していこうと思いました。