回答編集履歴

1

追記部分より下の行を追記

2018/12/02 13:20

投稿

退会済みユーザー
test CHANGED
@@ -25,3 +25,177 @@
25
25
  import jquery from 'jquery';
26
26
 
27
27
  window.$ = jquery
28
+
29
+
30
+
31
+ ## 追記
32
+
33
+
34
+
35
+ `es5`というバージョンのjavascriptにはjsのモジュール化という仕組みがありません。
36
+
37
+ そのため、複数のjsファイルでのやり取りはグローバルオブジェクト(`window`)でやり取りを行います
38
+
39
+
40
+
41
+ hoge.js
42
+
43
+ ```javascrip
44
+
45
+ window.hoge = funciton(){ 処理 }
46
+
47
+ ```
48
+
49
+
50
+
51
+ piyo.hs
52
+
53
+ ```javascript
54
+
55
+ window.hoge(); //hoge.jsで定義した関数を使う
56
+
57
+ ```
58
+
59
+
60
+
61
+ このやり方は、ファイル数が増えれば増えるほど、定義場所が不明になったり、piyo.jsより先にhoge.jsを読み込むなど読み込む順を気にする必要があったりと、色々問題があり、あまりよろしくありません。
62
+
63
+
64
+
65
+ ----
66
+
67
+ `node`はこれを解決するために`commonJs`というjsファイルをモジュール化する仕組みを取り入れる事で解決しました。
68
+
69
+
70
+
71
+ hoge.js
72
+
73
+ ```javascript
74
+
75
+ module.exports.hoge = function(){ 処理 }
76
+
77
+ ```
78
+
79
+
80
+
81
+ piyo.js
82
+
83
+ ```javascript
84
+
85
+ var result = require('./hoge');
86
+
87
+ result.hoge(); //hoge.jsで定義した関数を使う
88
+
89
+ ```
90
+
91
+
92
+
93
+ このようにする事で、使用者が`require`で読み込むjsファイルを指定するので、定義場所は明確にわかりますし、
94
+
95
+ 読み込みの順番を管理する必要がないなど先ほどの問題を解決しました
96
+
97
+
98
+
99
+ `commonJs`についてはご自身で調べてください。
100
+
101
+
102
+
103
+ ---
104
+
105
+ `browser`でも、この仕組みを使いたい訳ですが、あくまで`node`で実装されている仕組みであり、`browser`では使えません。
106
+
107
+
108
+
109
+ これを`browser`でも使えるようにするために開発されたものが`webpack`です。
110
+
111
+
112
+
113
+ ---
114
+
115
+ `jquery`は`scriptタグ`で読み込まれたか`require`(`import`)で読み込まれたか検知する仕組みがはいており、
116
+
117
+ `scriptタグ`で読み込まれた場合は、`window.jquery`(`window.$`)に展開し、
118
+
119
+ `require`(`import`)で読み込まれた場合は`module.exports`でjqueryオブジェクトを返すだけになっています。
120
+
121
+
122
+
123
+ そのため`import 'jquery'`でjqueryを読み込んでもwindow.$には何も入りません。
124
+
125
+
126
+
127
+ ---
128
+
129
+ ```javascript
130
+
131
+ import jquery from 'jquery'
132
+
133
+ window.$ = jquery;
134
+
135
+ ```
136
+
137
+
138
+
139
+ これを行うと問題は解決しますが、`webpack`でモジュール化をする利点が一切なくなります。
140
+
141
+ `webpack`を使うのであれば、個々のjsファイルで都度importするのが正しい使い方になります
142
+
143
+
144
+
145
+ hoge.js
146
+
147
+ ```javascript
148
+
149
+ import jquery from 'jquery'
150
+
151
+
152
+
153
+ jqueryオブジェクトを使う
154
+
155
+ ```
156
+
157
+
158
+
159
+ piyo.js
160
+
161
+ ```javascript
162
+
163
+ import jquery from 'jquery'
164
+
165
+
166
+
167
+ jqueryオブジェクトを使う
168
+
169
+ ```
170
+
171
+
172
+
173
+ app.js
174
+
175
+ ```javascript
176
+
177
+ import './hoge';
178
+
179
+ import './fuga';
180
+
181
+
182
+
183
+ ```
184
+
185
+
186
+
187
+ ---
188
+
189
+ 最後にrequireとimportの違いですが、
190
+
191
+ `browser`にはモジュール化の仕組みがないと記載しましたが、新しいバージョンのjavascriptではモジュール化の仕組みが入りました。(chromeなどではもう使えますが、IEでは使えません)
192
+
193
+ これは、nodeのcommonJsと同じような仕組みなのですが、書き方が変わり、import/exportになっています
194
+
195
+
196
+
197
+ `esModule`と呼ばれる仕組みなので。ご自身で調べてみてください。
198
+
199
+
200
+
201
+ `webpack`は、どちらの書き方にも対応しているので、どちらの書き方も解釈することができます。