25
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ES6で関数群を名前空間に押し込めるときどう書けばいいの問題

Last updated at Posted at 2017-11-08

3行で

  • 関数をHoge内にいくつか定義してHoge.someFunc() みたいな形で使いたい
  • クラスとして定義したが、これをインスタンス化することはなかった
  • 名前を付けて定義したobjectをexportすることにした

詳しく

あるユーティリティ系の関数群を、

app/javascript/foo.js
import Hoge from './utils/hoge';

Hoge.someFunc();

こういう形で使いたかったので、初めはこうしていました。

export class Hoge {
  static someFunc() {
  	console.info('do something');
  }
}

やりたいことはできていますが、Hogeは関数の集まりをまとめたモジュールなので、インスタンス化することはありません。そのため、classを使う必要はありません。

以下のように書くことができればいいのですが、調べる限りそういう書き方はないようでした。

export module Hoge {
  someFunc() {
    console.info('do something');
  }
}

検索していると、以下のStackoverflowを見つけました。


export default {
  myMethod1() {
    console.log('foo'); 
  },
  myMethod2(args...) {
    console.log('bar'); 
  }  
};

なるほどそう書けばいいのか。しかし、これだと毎回importする側でモジュールの名前を決めなければいけません。

import Hoge from './utils/hoge';

import側で決めるということは、このようにも書けます。

import Fuga from './utils/hoge';

これはどうなんでしょうか。やはりexportするところでモジュールの名前は決まっていたほうがいいような気がします。

少し考えて、名前を付けて定義したobjectをexportすることにしました。

utils/hoge.js
const Hoge = {
  someFunc: () => {
  	console.info('do something');
  }
};

export default Hoge

うん、これでやりたいことはできました。ただ、この書き方あまり見ないような気がします。

たとえばMastodonのソースを読んでみると、

import { getLocale } from '../locales';

のような具合に、関数を単体でimportしています。

関数群をconstで宣言したobjectに入れて、それを使うのはあまり一般的ではないんでしょうか。困ることはないので、問題が出るまではobjectごとexport,importする方式でいきたいと思っています。

その後(12/15追記)

この記事を書いたあと思い直して以下のようにオブジェクトをexportする書き方にしていました。

utils/hoge.js
export default {
  hello: () => {},
  goodbye: () => {},
  // ...
}

が、やはり補完が効かなくてつらいので、この記事に書いたようにobjectに名前をつけてexportする形に直しました。

utils/hoge.js
const Hoge = {
  hello: () => {},
  goodbye: () => {},
}

export default Hoge

export function で関数一つずつexportする方法も考えました。

utils/hoge.js
export function hello() { }
export function goodbye() { }

結局それでは関数名がかぶって補完が活かせないことになりそうだったのでやめました。たとえばAPIを叩くための関数群が複数あったとしたら、 load という関数がたくさんexportされて補完対象になってしまう。それをimportするときに毎回たくさんの候補から選んでいたらつらい、という感じです。

25
17
8

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
25
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?