LoginSignup
3
0

More than 1 year has passed since last update.

TypeScript(恐らくJavaScriptでも)で読み込むモジュールを切り替えたかった話

Last updated at Posted at 2022-10-05

そもそも何しようとしてたか

.envファイルや環境変数等の情報を元に、使うモジュールが切り替わる場合、使われないモジュールを読み込まなければ、CPUやメモリのリソースを削減できそうだと思い、色々試してみていました。
結論としては、どうしても使われる可能性のあるモジュールは全部読み込ませないといけないようだ、ということに至りました。

何をしたか

import文に可変な文字列を仕込む

const param = 'hoge_1';
import hoge from `./util/${param}.js`;

これに関しては、error: The module's source code could not be parsed: Unexpected token ```. Expected a string literalと出ました。

同じように、

const param = 'hoge_1';
import hoge from './util/' + param + '.js';

も、The module's source code could not be parsed: Expected ';', got '+'と、importに渡すパラメータ絡みと思われるエラーが出ました。

import文を分岐させる

importに渡すパラメータを変化させられないのであれば、import文周りを変化させれば良いではないか、と次善の策に出ました。

const param = 'hoge_1';
switch (param) {
  case 'hoge_1':
    import hoge from './util/hoge_1.js';
    break;
  default:
    import hoge from './util/hoge.js'
}

このようにしてみましたが、The module's source code could not be parsed: 'import', and 'export' cannot be used outside of module codeと出ました。どうもimportifswitchで分岐させることはできないようでした。

最終的に何したか

importさせるモジュールの切り替えには失敗しましたが、辛うじてコード内で使用するモジュールの切り替えは行えたので、それを紹介します。

import hoge_1 from './util/hoge_1.js';
import hoge_default from './util/hoge.js';

let hoge = /* なんかそれっぽい仮置きオブジェクト */;
const param = 'hoge_1';
switch (param) {
  case 'hoge_1':
    hoge = hoge_1;
    break;
  default:
    hoge = hoge_default;
}

最後に

今回に関しては、実際にこれをやりたかったコードでは、切り替えるモジュール群が大したことない大きさだったので別に大丈夫だったのですが、私が思うに、この世にはクソデカモジュール群があると思うのです……。そういった場合にはモジュールを本当に切り替える必要が出てくるのではないかと思います。
もし、モジュールを切り替える方法が実はあるということがあれば、コメント等よろしくお願いします!

3
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0