目次
なんとも大変な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を記していこうと思いました。