質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

942閲覧

webpackでのjsのモジュール化

asasaas

総合スコア26

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/09/09 08:11

webpackを使ったjsのモジュール化を勉強中なのですが以下のような内容で躓きました。

js

1//モジュール化前 2 3let positionX; 4let positionY; 5let color; 6 7const setStyle = () => { 8 positionX = generatePositionX(); 9 positionY = generatePositionY(); 10 color = color(); 11} 12 13const generatePositionX = () => { 14 ... 15} 16 17const generatePositionY = () => { 18 ... 19} 20 21const color = () => { 22 ... 23} 24 25setStyle(); 26. 27. 28. 29 30

以下モジュール化を試みた

js

1// ./app.js 2 3import { setStyle } from './modules/setStyle'; 4 5setStyle(); 6

js

1// ./modules/generatePosisiton.js 2 3export const generatePositionX = () => { 4 ... 5} 6 7export const generatePositionY = () => { 8 ... 9} 10

js

1// ./modules/color.js 2 3export const color = () => { 4 ... 5} 6

js

1// ./modules/setStyle.js 2 3import { generatePositionX, generatePositionY } from './modules/generatePosition'; 4import { color } from './modules/color'; 5 6export const setStyle = () => { 7 positionX = generatePositionX(); 8 positionY = generatePositionY(); 9 color = color(); 10} 11

この結果、バンドルは成功するのですが実行時に、setStyle()でpositionX...が定義されていないというエラーになります。
こういった、変数を他の関数によって更新するという関数をモジュール化する場合にはどのようなデザインパターンになるのでしょうか。

自分で考えると、setStyle()の引数にそれぞれ入力するという方法しか思いつかず、これが良い方法とは思えません。

また、setStyle.jsのように他のモジュールからモジュールに対してimportする方法は適していると言えますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/09/09 08:15

positionXやpositionYはグローバル変数、と考えて間違いないでしょうか?
asasaas

2020/09/09 08:43

現状はそうです。 記述を忘れていましたが、app.jsで宣言しています。
guest

回答1

0

ベストアンサー

グローバル変数を、setStyleの内部で変更しているために、モジュール分割してしまうと見えなくなります。
こんな感じでsetStyleの戻り値にオブジェクトを返して、

js

1// ./modules/setStyle.js 2 3export const setStyle = () => { 4 const positionX = generatePositionX(); 5 const positionY = generatePositionY(); 6 const color = color(); 7 return { 8 positionX, 9 positionY, 10 color, 11 } 12}

受け取り側では分割代入するとよいのではないでしょうか。

js

1// ./app.js 2import { setStyle } from './modules/setStyle'; 3 4let positionX; 5let positionY; 6let color; 7 8({ positionX, positionY color} = setStyle());

投稿2020/09/09 08:46

編集2020/09/09 11:21
standard-soft

総合スコア197

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asasaas

2020/09/09 09:03

なるほど、分かりやすいです。ありがとうございます。 ちなみにローカル変数を使えば、綺麗なコードになるのでしょうか? このようなパターンも実際に頻用されますか?
standard-soft

2020/09/09 11:23

グローバル変数はむしろほとんど使わないです。 きれいなコードのためにはローカル変数を使いましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問