+ JavaScript(ECMAScript)質問用スレッド vol.122 + [無断転載禁止]©5ch.io
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2016/08/29(月) 01:23:24.09ID:MUTWRWKoトランスパイラなどの関連技術の話題も取り扱うように変わりました。
ECMAScriptの言語仕様の話題。最新ECMAScriptによるモダンな書き方、Promiseやasync/awaitを
使った非同期プログラミング。ES2015、2016、2017等の最新ECMAScriptをブラウザで今すぐ使う方法、
ビルド環境やbowerやnodeのパッケージを使う方法等、モダンなJavaScript環境についての幅広い話をしましょう。
ECMAScript対応実行環境一覧(ブラウザやbabelを含む)
http://kangax.github.io/compat-table/es5/
http://kangax.github.io/compat-table/es6/ (= es2015)
http://kangax.github.io/compat-table/es2016plus/
http://kangax.github.io/compat-table/esnext/
JavaScriptとは?
もともとMozillaの前身のNetscapeが作った言語であり本来のJavaScriptはFirefoxの実装のみです。
JavaScriptの正式な仕様名はECMAScriptです。ですが一般に使われているとおり
ChromeやEdgeで使う言語もJavaScriptとしてこのスレでは扱います。
Firefox等のJavaScript実装は最新のECMAScriptに準拠しています。
※DOMはブラウザが提供しているものでありJavaScript(ECMAScript)の範囲外です。
なのでDOMを使ったプログラミングは原則としてこのスレの対象外です。
DOMはwindowオブジェクト(ブラウザのホストオブジェクト)経由で
参照するもので、window自体、window.document、window.Workerなどです。
これに関する話題はWeb制作板の下記のスレに移動してください。
+ JavaScript & jQuery 質問用スレッド vol.7 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/hp/1467906819/
+ JavaScript の質問用スレッド vol.130 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/hp/1463395557/
前スレ + JavaScript の質問用スレッド vol.121 + [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1468158373/
0285デフォルトの名無しさん
2016/09/03(土) 18:08:14.44ID:EZVA2rF2あんたは重要な点を見落としているね。
あんたが言っているのはすべてbabelを使わなうても当てはまることなんだよ。
ブラウザ間の互換性は完璧ではない。
あるブラウザには搭載されていて、あるブラウザには搭載されていない。
そういう機能がある。
babelはその機能の差を減らすものでしか無い。
話は単純。
1. ブラウザの間での違いはあるしなくならない。(もちろんbabelを使わない場合の話)
2. babelを使わないならばブラウザ間での違いが大きい。
3. babelを使うとブラウザ間の違いが減る。
これを前提の話をしよう。
0286デフォルトの名無しさん
2016/09/03(土) 18:13:17.33ID:EZVA2rF2という前提で話をすると、
ES6を完全に搭載していないブラウザが多く使われている今は
babelによって、その機能の差が大きく減る。
そしてその次はES2016、ES2017と話は進んでいく。
当然今のブラウザはES2016、ES2017の対応は少ないだろう。
ある時それらに対応したブラウザが一つだけでた。
となるとやっぱりブラウザの間の違いがでてくる。
そしてまた新しい仕様がでてきて、それに対応しているのはどれ?
という状況がずっと続く。
ブラウザの数は多い。バージョンアップの頻度も高い。
だからブラウザ任せでは機能の差を埋めることは難しい。
そこでbabelがでてくる。babelを使うことで機能の差は減る。
0287デフォルトの名無しさん
2016/09/03(土) 18:16:26.40ID:EZVA2rF2> でも、モダンで良いコードを書きたいという気持ちが強いなら、古く取り残された環境を切り捨てる勇気も必要だと思う。
モダンで書くよりも重要なのは、今あるブラウザで動かすこと。
そしてその次が開発コストを下げること。
多種多様なブラウザを相手にしていたら開発コストは下がらない。
だからbabelを使ってブラウザ間の違いを減らして
コストを下げることが重要になる。
その次だよモダンで書くことでコストを下げるという理由がくるのは。
優先順位は低い。だからbabelで対応していないものは使わないと言う
選択肢が当然成り立つ。
そして「babelで対応していない機能」は「babelを使わなくてもブラウザが対応した時」に使えばよかろう?
ES6の機能をすべて使うことが目的じゃないんだからさ。
0288デフォルトの名無しさん
2016/09/03(土) 18:18:01.40ID:EZVA2rF2> ES6対応以降のモダンなブラウザとの二極にするというのはある案だと思っているし、俺のところは今年度からそうしてる。
Safari最新版はアロー関数に対応していないんだが?
0289デフォルトの名無しさん
2016/09/03(土) 19:21:50.91ID:N47o0j5/Safariはモダンブラウザに含めていない。
ウチではずっとChrome第一Firefox第二、近頃はEdge第三。
他は眼中にない。
0290デフォルトの名無しさん
2016/09/03(土) 19:27:20.93ID:EZVA2rF2じゃあスマホは?
例えばAndroid 4系はアロー関数に対応していない。
http://caniuse.com/#feat=arrow-functions
0291デフォルトの名無しさん
2016/09/03(土) 19:32:55.57ID:EZVA2rF2https://www.netmarketshare.com/browser-market-share.aspx?qprid=0&qpcustomd=0
ブラウザの66.82%にしか対応していません。
モバイルの場合は
https://www.netmarketshare.com/browser-market-share.aspx?qprid=0&qpcustomd=1
Chrome、Firefox、Edgeの53.65%にしか対応していませんってことだよね。
(Android Browserを入れても62.22%)
0292デフォルトの名無しさん
2016/09/03(土) 19:35:23.00ID:N47o0j5/いや、逆だよ。超逆。
Androidの古いブラウザを切り捨てられる時期というのが強い。
Android 4系と言っても、実は後半くらいか徐々に、終盤は大体、
ベンダーがChrome載せててデフォルトにしてるから、実は問題ないんだよ。
一番問題あるのはSafariくらいで、それももうすぐだろう。
誤解無いように書くが、
上でも言ったようにプログレッシブ・エンハンスメントだし、
当然全てのコードを書き換えたわけではない。
今年度から新しく初めて長くメンテしていくサービスでのコードは原則そういうポリシーになっただけ。
なので問題は無い。
0293デフォルトの名無しさん
2016/09/03(土) 19:40:30.57ID:EZVA2rF2意味がわからん。
重要なのは切り捨てるタイミングと
コードを新しくするタイミングの問題。
babelを使うと古いブラウザを切り捨てるタイミングを
自由にコントロールできる。
そして古いブラウザを切り捨てるよりも前にコードを新しくできる。
つまり古いブラウザを切り捨てたときにはすでにコードは新しくなってる。
あんた、今、古いブラウザを切り捨てたのに、
古いコードを抱えてるじゃん。
> Android 4系と言っても、実は後半くらいか徐々に、終盤は大体、
> ベンダーがChrome載せててデフォルトにしてるから、実は問題ないんだよ。
だからシェアのリストだしただろ? ChromeとAndroid Browserを
入れたとしても62.22%にしかならない。
>>284は説明上手いな。
0295デフォルトの名無しさん
2016/09/03(土) 20:15:24.73ID:EZVA2rF20296デフォルトの名無しさん
2016/09/03(土) 20:18:55.72ID:EZVA2rF2どれだけ多くの世間で使われているブラウザに対応できるか。
俺が一番重要視してるのは、より実用的なのはどれかだよ。
ES6対応度テストで9割合格していても、
それが今使われてるブラウザの6割じゃ役に立たない。
ES6対応度テストで8割でもそれを使うことで
ブラウザの9割で動かせるほうが重要。
0297デフォルトの名無しさん
2016/09/03(土) 20:22:54.41ID:N47o0j5/>>babelを使うと古いブラウザを切り捨てるタイミングを
>>自由にコントロールできる。
いやー一年前まではそう思ってましたよ。
上でも書いたけれど、君の発言を見てると一年前二年前の若い自分を思い出す。
でもそうじゃなかったから使ってないの。まだ分からない?
理由は大体書いたよ。
babelただ使うだけで使わないよりも『より良くなる』時代ってのはもう終わったの。
あんまり踏み込んで欲しくないので書かなかったことを少しだけ言うと、
ウチではES6基本というのは実は嘘。今はもうES2016基本にしかけてる。
で、そのために、『より良くする』ためにbabelではないがトランスパイラ+ポリフィル使ってる。
が、これもES2016の重箱の角はつつけていないので、本当は使わないで済むなら使いたくないのよ。
モダンなコードを書くメリットと、重箱の角を心の隅で気にしないといけないコストと、若干の好奇心のつり合いを見て今はこういう形になっている。
だから本当に100%ES2016で開放された気分で書けてるのかというとそうではない。
あれだけ変更の少ない2016->2015でもそうなんだよ?
babelのES5変換なんて満足できていたのは最初だけ、ブラウザの対応が未熟だった頃だけだよ。
当初君と同じ夢を見ていたウチのメンバーは一年くらいかけて
実は古いブラウザというしがらみから逃れるために、babelというしがらみに縋ってただけだって気がついたの。
今はbabel使って後から外すなんて夢物語だよ。黒歴史。
実はそういった試みで始めたものいくつかあったんだが、まともに活用しきれない。
多くは実らず捨てることになって、一部は泣きながらリファクタリングしてる最中。
0298デフォルトの名無しさん
2016/09/03(土) 20:24:00.35ID:N47o0j5/でもまあ、ふと思ったけど、俺も今のbabelは触ってないからな。精々半年前の感覚のままだ。
今はもしかしたら殆ど完璧になってて、憂いが減ってんのかな?
そこはちょっと反省。
どうしてbabelで旧ブラウザの対応するのを見限ったかって言うとね、
そもそも、babelのバグや細かい非互換のせいで大きいコードがしばしばまともに通らなかったからだよ。
だから、笑えるけどbabelで通るように書き換えてたの。当然歪になってるから使い回せない、使い回したくないの。
でも今babelの対応状況改めて見てみたらやっぱり無理だ。
マイナーかもしれないけれど、毎度一箇所は使うだろう点が残ってる。
やっぱり痛いのはプロトタイプの設定や、サブクラス化かなぁ。
めっちゃ使うということは無いが、ここらを我慢するのはやっぱりES6使ってるとは俺は思えないわ。
0299デフォルトの名無しさん
2016/09/03(土) 20:26:29.35ID:EZVA2rF2あんた自分で言ったセリフ思い出してね。
> Safariはモダンブラウザに含めていない。
> ウチではずっとChrome第一Firefox第二、近頃はEdge第三。
Safariに対応できてない、IEに対応できてない。
対応できるブラウザは6割。
それがお前が今できることの限界だよ。
無意味な中傷せんと、皆の意見を真摯に聞いとけ。
だいたい同じ事言ってる。
あとな、動作が同じって、それは違うからな。
いくら時間がかかっても良いから同じ結果を出します、ってのは、結果同じでも動作違うからな。
万回以上呼ばれだしたら体感で速度変わるし。
>>278に対してだけど。
0301デフォルトの名無しさん
2016/09/03(土) 20:28:02.67ID:EZVA2rF2> そもそも、babelのバグや細かい非互換のせいで大きいコードがしばしばまともに通らなかったからだよ。
> だから、笑えるけどbabelで通るように書き換えてたの。当然歪になってるから使い回せない、使い回したくないの。
だったらbabelで通るように書き換えないで、
その機能を使わなければいいだけでは?
だってそもそもbabelを使わないならば
その機能は使えないんだからさ。
その機能を使わないと言う選択肢をとることはできるはずだ。
0302デフォルトの名無しさん
2016/09/03(土) 20:28:44.55ID:EZVA2rF2今はお前と話はしてない。
お前のみんなの扱いはすでに決まってるんだよ。
おバカさんw
そう。だから、結局同じ構文で書いた、ただのbabelって処理系用の言語なんよね。
>>301
それは、babel用のコードを書くに、他ならなくないか?
babel無視したら、そんな回避コード書かんで良いんだから。
俺が仕事でES5書いてるのとレベル全く変わらんじゃないか。
0304デフォルトの名無しさん
2016/09/03(土) 20:30:30.26ID:EZVA2rF2言ってることが抽象的すぎて
具体例が一つもないよね。
問題があるという前提で話をしているが、
そもそも、お前が言う問題は本当にあるのか?って話。
まず、具体的な問題があることが前提だから
どういうときに問題があるのかを言ってくれないか?
0305デフォルトの名無しさん
2016/09/03(土) 20:31:13.84ID:EZVA2rF2> それは、babel用のコードを書くに、他ならなくないか?
ぜんぜん違う。その言語はES6でそのまま動く
ES6用とbabel用に違いはない。
お前の中だろ。
問題を極端に矮小化したり拡大解釈したり、一般化したり特殊化すんのは良くないぞ。
0307デフォルトの名無しさん
2016/09/03(土) 20:32:03.05ID:EZVA2rF2わざわざES6のコードを避けるほうが大変だろwww
どちらがどれだけ大変かの話をしてる。
babelを使えば、避ける必要性が大きく減る。
0308デフォルトの名無しさん
2016/09/03(土) 20:32:49.45ID:EZVA2rF2あっちのスレでもお前、馬鹿にされてるじゃんwww
自覚しとけ。
お前は俺に反論できないことはたくさんあったが
それはお前にほとんどレスしてるだろw
ES5もES6でそのまま動くよw
babel用に使えないものがあるから使わないのは、ES6のサブセットじゃん。
babel用に使えないものを避けて書いたのと、気にせず書いたES6は違うコードなんじゃねえの?
明後日のレスだけして、それで答えた気になってたらしゃーないわ。
避ける方が大変?なんだそりゃ。
言語仕様把握せずに開発してる訳でもあるまい。
規約が無い訳でもあるまい。
子供のバイトみたいな話しないでくれ。
0312デフォルトの名無しさん
2016/09/03(土) 20:37:02.13ID:EZVA2rF2> ES6のサブセットじゃん。
ん? 各ブラウザのES6の実装度を知らないのかな?
どのブラウザでも使えるのはES6のサブセットでしか無いんだけど?
0313デフォルトの名無しさん
2016/09/03(土) 20:38:01.48ID:EZVA2rF2> 避ける方が大変?なんだそりゃ。
そりゃそうだろ。
どのブラウザで、どの機能が使えるかをいちいち把握しないといけない。
お前アロー関数がSafariで使えないことを把握していたか?
そういった細かい機能を把握する必要がなくなる。
0314デフォルトの名無しさん
2016/09/03(土) 20:38:52.88ID:EZVA2rF2動かないってことを知ることは出来ないんだよ。
そうだね。
だから、ブラウザごとに要件定義すんじゃんね。
そこに、これまたbabelって処理系が入る、と。
お前の理屈破綻してるのわかる?
どこが、一つのES6で良いの?w
最大公約数で書けば良い、なら、
ホントに最大公約数で書けばいいじゃん。ES5。
要件定義できるなら、その最大公約数で書けばいいだけ。
中途半端に先端気取って無駄な事なの。
0316デフォルトの名無しさん
2016/09/03(土) 20:41:56.59ID:EZVA2rF2babelを使わないと、
1〜100までのすべてのブラウザを考慮しなければいけなくなる。
babelを使えば80以下のブラウザがすべて80にまで底上げされるから
80〜100のブラウザだけを対応すれば良くなる。
してたよ。
ついでに言うとOperaも対応してない。
Android標準ブラウザは4系でも全滅。IEも11でも使えない。
ES5で書けば100のブラウザ相手に書けんじゃん。
底上げしたから、何もしなくて良いわけでもないし。
骨折り損。
0319デフォルトの名無しさん
2016/09/03(土) 20:45:14.45ID:N47o0j5/何が言いたいのか、いやもう建設的な話し合いをする気は無いんだろうけど、
一応会話してみるか。
対応するときはES5で書く。それだけでしょ?
そして、その話は本題と関係ないでしょ?
古いブラウザを見限っていいから、Babelを使うなと言ってるんじゃないから。
古いブラウザを見限らないとしても、ウチではBabalは使わない。ただES5で書くだけ。
まさかウチではもう今年度からピュアES6しか書きませんと言ってるのだと思ってた?
誤解させてごめんね。
で、本題はBabalの吐くコードはES_Babalであって、ES6とは遠からず近からずなものでしかないということ。
ES6を使いたいから、後々外せばいいだけだから便利、な感覚でBabelを使うと怪我するよと言ってるの。
Babalを使うのなら、あくまでES_Babelというalt JSを使うんだという認識・覚悟で居たほうが正しい。
そして副題として、俺はそれは嫌ということ。ここは個人的な部分だし、環境なので異論は認めるし、批判は受け付けていない。
二極化提案については、まだ実験中で良し悪し分からず、オススメする気もなくポロッと言ってしまっただけだし、
あまり深入りしてほしくないのでこれ以上話したくない。
0320デフォルトの名無しさん
2016/09/03(土) 20:45:47.57ID:EZVA2rF2> だから、ブラウザごとに要件定義すんじゃんね。
> そこに、これまたbabelって処理系が入る、と。
ブラウザは実行環境、
babelはトランスパイラ。
違うものを混ぜるなって何度も言っただろ。
お前はES6に対応していないブラウザを一つずつ何個も
この機能は使える?使えない?って悩んでいるのだろうが
babelを使うと、多くのブラウザの最低レベルが揃うんだよ。
お前の言葉で言う最大公約数がES6に底上げされる。
最大公約数5よりも最大公約数10の方がいいだろw
0321デフォルトの名無しさん
2016/09/03(土) 20:46:33.45ID:N47o0j5/0322デフォルトの名無しさん
2016/09/03(土) 20:49:51.97ID:EZVA2rF2なんか一人二役ご苦労さんって感じになってきたな。
わざとらしく大文字小文字を使い分けてるのかい?www
> 対応するときはES5で書く。それだけでしょ?
そのES5をES6に書き換えるコストは誰が払うんだ?ずっとES5のまま?
なんで可読性、メンテナンス性が低いコードを今のタイミングで量産するのさ?w
長期的なバージョンアップっていうのが考慮されてないぞ。
> で、本題はBabalの吐くコードはES_Babalであって、ES6とは遠からず近からずなものでしかないということ。
なんでそこでbabelの吐くコードを気にしないといけないのかわからん。
そもそもbabelの吐くコードはES5だ。ES_Babelなんてものはない。
babelは言語ではなくて単なるトランスパイラ。言語はES6そのもの
0323デフォルトの名無しさん
2016/09/03(土) 20:50:46.13ID:EZVA2rF2> ES5で書けば100のブラウザ相手に書けんじゃん。
ただし可読性とメンテナンス性が低いコードになる。
0324デフォルトの名無しさん
2016/09/03(土) 20:52:05.59ID:EZVA2rF2> ついでに言うとOperaも対応してない。
> Android標準ブラウザは4系でも全滅。IEも11でも使えない。
そっかー、babel使ってテストにもちゃんと通って
手動でも確認したときも問題なく動いていたから知らんかったわーw
まあ嘘だけど、このようにいちいち把握する必要がなくなる。
0325デフォルトの名無しさん
2016/09/03(土) 20:52:33.02ID:vfo9HhT2C#のラムダ禁止おじさんとか
ラムダは積極的に使えば良いのにな。
0329デフォルトの名無しさん
2016/09/03(土) 20:56:57.70ID:EZVA2rF2> 言語は、そのものじゃなくてサブセットなんじゃねえの?
そうだなES6の殆どが使えるがサブセットだなw
それよりもES6に完全対応してないブラウザの方が
より大きな問題だよ。
0330デフォルトの名無しさん
2016/09/03(土) 20:58:33.36ID:N47o0j5/俺はともかく、ES6ってそんなレベルじゃねーぞって変なこだわり言ってるだけだから。
とりあえずBabel使うとES6でガッツリ書けます。将来的には外すだけみたいに言わないでくれれば他はどうだってよかった。
相手が建設的な話し合いする気がないどころか、現実逃避始めちゃったので、今となってはそれすらどうでもいい。
>>320
>>babelを使うと、多くのブラウザの最低レベルが揃うんだよ。
そう。いいこと言った。
最初からこのくらいに収めてくれてれば俺が駄スレで駄レス重ねる必要もなかったのに。
結局会話にならなかったし、ほんと、無駄な時間過ごしちゃったな〜
0331デフォルトの名無しさん
2016/09/03(土) 20:59:03.26ID:EZVA2rF2> 必要が無いのと、無責任なのは違うよ。
誰が無責任でいられるって言ったんだよ。
アホかw
ちゃんとテストコード書いて問題なく動くことを確認してる。
それが責任を果たすということだろ。
> あと、letも、ずっとSafariだけ未対応だった。
せっかくより良くなったES6を
全く使えない状況になるんだよねw
0332デフォルトの名無しさん
2016/09/03(土) 21:01:48.79ID:EZVA2rF2> とりあえずBabel使うとES6でガッツリ書けます。将来的には外すだけみたいに言わないでくれれば他はどうだってよかった。
もちろん将来的には外すだけじゃねーよw
しっかりテストコード書いて、テストする。
これは、babelとは関係なく、ブラウザのバージョンアップでも
急に動かなくなったりする可能性があるのだから当然するべきこと。
babelを外してもし動かなくなるのなら、その部分だけの修正で済むだろ。
今からbabelを外して動くかどうかもテストしてればいいんだよ。
それをやってるから、ES6で書いてbabelを使っても使わなくても
同じように動くコードになるって言ってるの。
0333デフォルトの名無しさん
2016/09/03(土) 21:09:12.58ID:N47o0j5/だからね。君が言ってるそれは、BabalがES6のコードを完璧にES5に変換できるということ前提なの。
実際はね、ES6ではなく、ES_Babalで書かないといけないの。
ES_BabalというのはES6から機能と安定性を取り去った言語なわけ。
で、それを将来ES6か何かに書き換えるわけ。
それがES5のしがらみとどっちが強いかは人次第なのかもしれない。
君はそれに十分満足していて、俺は不満。ただそれだけなのかもしれない。
でも、ES6を使いこなしていったらすぐに俺の考えに近くなるんじゃないかなという想像。
無駄なおせっかいだったのよ。それだけ。
0334デフォルトの名無しさん
2016/09/03(土) 21:13:20.81ID:EZVA2rF2だから書かなくて良いんじゃないですかねぇw
ES6で完璧に書けないものは書かなくていい。
なんでES6を使うって言ったら、babelで使えない機能まで
ES6を使おうってするんだ?w
どうせテスト書くだろ。完璧に動かなくてもテストで通る範囲が動けば問題ないんだよ。
そもそもブラウザですらES6に完全に対応していない。
どちらにしろES6に完全対応していない環境と言う前提のもとで、
正しく動くアプリを作るんだよ。作るのが仕事なの。
そしてより可読性、メンテナンス性に優れたコードを今すぐ書くということ。
テストコード書いて問題なく動く、そこが違うんだよなぁ。
こっちは仕様と実装からテスト仕様書いてて、
お前は仕様からしか書いてないんだもの。
>>332
お前は本当に何を問題とされているかわかんねえやつだな。
0336デフォルトの名無しさん
2016/09/03(土) 21:17:26.35ID:EZVA2rF2こっちは仕様と実装からテスト仕様書いてて、
え? だからそのテスト仕様書通り動けばいいだろ?
何言ってるのかさっぱりわからんwww
0337デフォルトの名無しさん
2016/09/03(土) 21:18:06.86ID:EZVA2rF2あ、実装を書かないとテスト仕様書が書けないタイプ?
0338デフォルトの名無しさん
2016/09/03(土) 21:21:04.16ID:EZVA2rF2要するにprivateメソッドを書いてから
そのテストコードを書くって言ってるのかな?
まあまた意味不明なことを言い出したなって
思ってますよw
0339デフォルトの名無しさん
2016/09/03(土) 21:23:23.04ID:EZVA2rF2同じ動作をしていてもアプリは問題なく動いていても
失敗するものってことでいいんですか?
当たり前だろ。。
>>338
違うよ。
コードを書く/書いてもらう前に、何もかも分かった状況にして、こうすれば書けるから、と実装に対する詳細設計を起こすよね。
その詳細設計から書くじゃん、テスト。
実装、がもしかして食い違ってる?
お前が書く内容、って意味じゃなくて、処理系の実装、な。
しかし、改めてbabel見てみたが、末尾再帰もできんままか。
何言ってるのかわからん。
その処理系でテストを完了していない限り、失敗も成功もないだろ。宙ぶらりん。
だからテストすんじゃん。
0342デフォルトの名無しさん
2016/09/03(土) 21:28:37.51ID:EZVA2rF2http://teppeis.hatenablog.com/entry/2015/03/es6-tail-call-optimization
2015-03-29
BabelとTraceurでES6末尾再帰最適化を試す
ちょっと前にBabelに末尾再帰最適化が入って話題になったけど、同じくTraceurにもv0.0.85で最適化が入ったので試してみた。
0343デフォルトの名無しさん
2016/09/03(土) 21:28:59.57ID:N47o0j5/うん。だから君は、ES6を、モダンで良い言語で書きたいから使ってるわけではなく、
「Babelが対応してる機能」を「Babelが対応してるから」使ってるだけでしょ?
普通はES6で書いて動かすためにトランスパイラを試す筈だが、
君はおそらくBabelをES6入門用的に使っているのだろう。
Babelはもう成長しないが、君はどうするの?
うーん。もしかして、ES2017や18の時代になっても、
Arrayのサブクラスすら作れないなんちゃってES2017で書くの?
ES6-サブクラス+デコレータ-hogehoge+fugafuga
みたいなおかしな言語で書き続けるの??
そこに無理があると言ってるのよ。
君ももし本当にES_BabelをES6と信じてるのなら成長したほうが良いよ。
で、Babelは使うのは良いが憂いができるだけ少なくなるようにした方がいい。
0344デフォルトの名無しさん
2016/09/03(土) 21:32:40.61ID:EZVA2rF2337 自分:デフォルトの名無しさん[sage] 投稿日:2016/09/03(土) 21:18:06.86 ID:EZVA2rF2 [83/86]
> こっちは仕様と実装からテスト仕様書いてて、
あ、実装を書かないとテスト仕様書が書けないタイプ?
340 返信: ◆SEdFBOkLSw [sage] 投稿日:2016/09/03(土) 21:24:59.62 ID:YIu9WVDu [24/25]
>>337
当たり前だろ。。
この流れで、↓これとか
> コードを書く/書いてもらう前に、何もかも分かった状況にして、こうすれば書けるから、と実装に対する詳細設計を起こすよね。
> その詳細設計から書くじゃん、テスト。
・・・馬鹿なのか?
1. 実装に対する詳細設計を書く
2. つまり詳細設計は実装を書くよりも前に存在する。
3. (実装を書く前の)詳細設計からテストを書く。
実装を書かなくてもテスト仕様書は書ける。
おお、if文のあとの再帰で死ぬやつ治ってんだ。
ちなみに、その話のあと、一旦disabledになったのよ。
だから。もう。
お前がどう書くかは関係ねえの。
それからテスト書いたら意味ねえじゃん。
ホワイトボックスで、それが検証可能な事には意味があるけど、そうじゃねえよ。
処理系の実装だよ。
0347デフォルトの名無しさん
2016/09/03(土) 21:41:34.55ID:EZVA2rF2> 「Babelが対応してる機能」を「Babelが対応してるから」使ってるだけでしょ?
違う。ES6の機能のうち、babelで変換しても確実に動くものだけを使ってる。
だから「ES6が対応している機能」のうち「babelでも対応しているもの」を使っている。
が正解。
そしてそれは普段から書いている「実際のブラウザで問題なく動くか?」という
テストがあれば追加工数は必要なくテストできる。
> Babelはもう成長しないが、君はどうするの?
成長してないと判断したところはどれ?
見ての通りes2017に対応したプリセットもある。 http://babeljs.io/docs/plugins/preset-es2017/
仮にbabelが成長しなくても、今書いているコードはそのままES6対応ブラウザで動くし
ES5ブラウザでも動く。今のやり方はそのまま続けられるじゃん。
場合によっては古いブラウザを切り捨てることで、babelが無くても動く。
将来の心配をしなくて済む。そこがAltJSとの違い。
> ES6-サブクラス+デコレータ-hogehoge+fugafuga
> みたいなおかしな言語で書き続けるの??
と言われてもね。現実に存在するブラウザが、そんな感じでしょw
ES6の全てに対応していない。あんた今、そんなおかしな言語で書いてるんだよw
> うーん。もしかして、ES2017や18の時代になっても、
> Arrayのサブクラスすら作れないなんちゃってES2017で書くの?
Arrayのサブクラスを使わないでES2017で書くよ。
お前は古いブラウザを切り捨てるんだろ?
それが要件として認められるならば、俺古いブラウザを切り捨てるだけだよw
0348デフォルトの名無しさん
2016/09/03(土) 21:46:47.80ID:EZVA2rF2またマッチ・ポンプ?w
テストは実装前に書くって話でいいんだよね?w
俺が言いたいのは、>>335でお前が言った
> こっちは仕様と実装からテスト仕様書いてて、
実装からテスト仕様書くなやってことなんだけど?
で、俺は仕様と詳細設計からテスト仕様書書いて
それをテストコードにしてるから、
実装が変わっても問題ないって話をしてるんだけど。
だから、処理系の実装だってば。
お前話の流れが読めないやつだな。
前のレス見ればわかんじゃん。
>>347
だから、それがbabel用のコードなんじゃねえの?
ES6と同じ構文で書いたES6のサブセットな、babelにコンパイルさせる為の言語。
ただ、そのまま他の環境でも動くだけで。
それは、ES5を書いて、これはES6の仕様範囲内だから、ES6です、って強弁するのと変わらんではないか。
0350デフォルトの名無しさん
2016/09/03(土) 21:54:03.20ID:N47o0j5/うーん。君のポリシーがよくわからないね。
今のブラウザがES6の全てに対応していない?
そりゃそうだ。ES5すら全てに対応してるわけではないからね。
ということは、それより遥かに劣るBabelは極めて不完全って認めるわけなの?
さっきも言ったが俺はそここそが一番気になるんだから。
いや違うか、君は不完全でも気にしないと言ってるわけだ。
ES6とES_Babelの見分けなんてつかないよと、
いや、Babelで変換できないES6の機能なんてES6と認めないよと言ってるわけだ。
やっぱり君はBabel志向なんだよ。
それは違う、とにかく対応を広げるために機能の劣るBabelを仕方なく使ってるんだっていうなら
やっぱりES6ではなくES_Babelを書いてるってことを認めないといけない。
それか、実はES6なんて理解してなくてBabel志向なだけですというのも理屈が通る。
そのどちらか。
0351デフォルトの名無しさん
2016/09/03(土) 21:57:03.42ID:EZVA2rF2> だから、処理系の実装だってば。
処理系の実装ってなに?
お前は処理系の実装のテストを "書いている" といった。
そうわざわざ言うってことは、当然普段から書いているのだろう?
ブラウザの場合お前はbabel等を使わない。
ってことは当然処理系の実装のテストというのは、
ブラウザが持っているJavaScript実装。
ChakraやSpiderMonkeyやV8という処理系であるはずだ。
お前はこれらのJavaScriptエンジンを
わざわざ開発元がやってるはずのテストを
JavaScriptエンジンの開発や検証という段階でもないのに、
アプリの開発という仕事の中でやってるということか?
そういう話でいいのか?
0352デフォルトの名無しさん
2016/09/03(土) 21:59:14.75ID:EZVA2rF2> だから、それがbabel用のコードなんじゃねえの?
> ES6と同じ構文で書いたES6のサブセットな、babelにコンパイルさせる為の言語。
ES6のサブセットという言語はない。
俺がES6のサブセットを使っているだけ。
そもそもどのブラウザもES6に完全対応してないのだから
俺だけじゃなくてみんなES6のサブセットを使ってる。
お前、SafariでES6のサブセットを使ったら、
それをSafariで動かすための言語っていうのかよwwww
それぐらいわからんかなw
0353デフォルトの名無しさん
2016/09/03(土) 22:05:42.45ID:EZVA2rF2> 今のブラウザがES6の全てに対応していない?
> そりゃそうだ。ES5すら全てに対応してるわけではないからね。
>
> ということは、それより遥かに劣るBabelは極めて不完全って認めるわけなの?
そこが話がつながってない。
babelはES6に対応していないブラウザをES6対応に近づけるものであって、
ブラウザとES6対応度で競争しているわけじゃない。
ブラウザは他のブラウザとES6対応度で競争しているかもしれない
その競争でどこそこのメーカーのブラウザが劣っているか劣っていないかって
いう話をするのならわかる。
だがbabelの目的は、劣っているブラウザを救済する所にある。
babelと比較するのであれば同じ目的のTraceurやClosureだろう。
あんたはES6を使いたいとしか思ってないようだが、
俺が一番に考えているのは、より多くのユーザーが使ってるブラウザで動かすということだ。
その上で可読性やメンテナンス性を上げるという理由で出来る限りES6を使うって話をしてるんだよ。
文盲なの?
そのエンジンと自社製品の組み合わせのテストだよ。
>>352
最後。
その通り、Safariの為の言語だよ。その時点では。
SafariとFireFoxの為に書いたのであれば、SafariとFireFoxの為の言語。
0355デフォルトの名無しさん
2016/09/03(土) 22:17:06.63ID:EZVA2rF2ブラウザごとにソースコード書き換えてるのか?
あるサイトを作ったとして、
Chromeはアロー関数を使ったコードで
Safariはアロー関数を使わないコード。
一つのコードで複数のブラウザに対応するのではなく
各ブラウザごとに書き換えたを変えてるのか?
まさかな。babelを使うと一つのコードで
複数のブラウザに対応できるぞwww
0356デフォルトの名無しさん
2016/09/03(土) 22:18:28.08ID:W9R0/4bkバベル君の事が理解出来る様に、オレも少しかじってみるわw
0357デフォルトの名無しさん
2016/09/03(土) 22:18:34.81ID:EZVA2rF2> そのエンジンと自社製品の組み合わせのテストだよ。
言い方がおかしいな。
普通は
そのエンジンと自社製品の組み合わせ「で」テストをするという。
確認するが
そのエンジンと自社製品の組み合わせ「の」テストを書いているという意味か?
0358デフォルトの名無しさん
2016/09/03(土) 22:19:06.56ID:N47o0j5/うん。それならいい。
あくまでES6を意識したBabelScriptという下駄を古いブラウザに履かせるという認識ならいい。
裏切りを知らないサンタクロースを信じる子供か、黒歴史を未経験な魔法に憧れる中二病患者かと思ったから忠告したけど、
そうでないのなら尽く良い。
その他いろんな話をしたが、もうそれに関しての共通理解は諦める。
0359デフォルトの名無しさん
2016/09/03(土) 22:20:31.06ID:EZVA2rF2◆SEくんおもしろいw
> その通り、Safariの為の言語だよ。その時点では。
じゃあブラウザとバージョンの数だけ別の言語があるってことかい?
0360デフォルトの名無しさん
2016/09/03(土) 22:21:58.64ID:EZVA2rF2> 裏切りを知らないサンタクロースを信じる子供か、黒歴史を未経験な魔法に憧れる中二病患者かと思ったから忠告したけど、
だからテストコードを書いている。
このテストコードはbabelを使った場合と使わない場合の両方で動く。
裏切られる前提で、裏切られてもすぐに修正できるように
ちゃんと対策をしている。
0361デフォルトの名無しさん
2016/09/03(土) 22:24:51.69ID:EZVA2rF2なぜならばどのJavaScriptでも同じブラウザでも
バージョンが違えば、わずかながらでも違いがあるから。
ECMAScriptという仕様を完全に見対している言語もない。
そういえばC++も仕様を完全に満たしている処理系はないっていわれてるな。
つまり、それぞれの処理系で別々の言語が実装されている。それはC++とは呼ばないw
え?MSの2012でコンパイルできる、cppのソースコード、以外の、現実に則した表現あるの?
0364デフォルトの名無しさん
2016/09/03(土) 22:31:28.65ID:EZVA2rF2> お前も認めてたじゃん。どのブラウザもサブセットだって。
お前、毎度毎度、重要な単語を抜き取るよなw
わざとやってるだろ。
どのブラウザも「JavaScript(ECMAScript)という言語の」サブセットだって
言ったんだよ。別の言語であればそれはサブセットとはいわない。
そうよ。おかしかったらパッチ書いてプルリクするもの。
0366デフォルトの名無しさん
2016/09/03(土) 22:32:33.75ID:N47o0j5/そこに関しては納得してる。
俺が違和感があるのは、よくそれで問題にならず我慢できるなってこと。
よくArrayのサブクラスとか作らないで済むね?
Proxy使ったこと無い?@@系は?
当然独自クラスシステムフレームワーク構築するのに
プロトタイプ書き換えるとか当然やったこと無いんだろうな〜
って感じ。
そういう驚きと、同じ世界に居ない悲しみ。そんなとこ。
重要な単語も何も、本家とサブセットは関係が定義できようが、
サブセット同士はただ違うものとしか。
0368デフォルトの名無しさん
2016/09/03(土) 22:33:53.31ID:EZVA2rF2> 依存部分はライブラリで吸収するから。
アロー関数は文法なんだから、JavaScriptファイルを
分離しないと、構文エラーになるんだが?
そのライブラリはブラウザごとに読み込むファイルを分けるのか?
またパフォーマンスが落ちそうなことをwww
0369デフォルトの名無しさん
2016/09/03(土) 22:35:25.80ID:EZVA2rF2だから、そうやって重要な単語を抜き取って焦点をぼかすのはやめろ。
とある言語の、サブセット同士が違うものであっても
それはとある言語のサブセットであって、言語としては同じだろうが。
BASICはどの実装でもBASICであり
COBOLはどの実装でもCOBOLだ。
0370デフォルトの名無しさん
2016/09/03(土) 22:37:05.23ID:EZVA2rF2> よくArrayのサブクラスとか作らないで済むね?
といわれてもね。長年やってるからね。
長いES5の時代にArrayのサブクラスをつくらないで
やってきた人間に、そんなこといわれてもねw
その他も同じ。
お前のほうがやってきた経験少ないんじゃね?
0371デフォルトの名無しさん
2016/09/03(土) 22:41:45.37ID:EZVA2rF2そうだな。君、何かのポリフィルを自分で考えたことある?
特定のブラウザでは簡単にできないことを、
別の方法を使って実現するってことをやったことある?
そういう経験がないんじゃないかな?
バッドノウハウといわれるけど、仕事ではそれをやらないといけない。
Arrayのサブクラスが作れないからできませんって
簡単に泣き言を言ったらだめだよ。
Arrayのサブクラスを作ることが目的になることはまずない。
別の方法で顧客の要求を実現するんだよ。
これって発想力の問題かなぁ、それとも問題解決能力?
0372デフォルトの名無しさん
2016/09/03(土) 22:56:19.81ID:N47o0j5/当然俺もいきなり活用できたわけじゃない。
折角の機能活用できるようになろうとここ1,2年実験・研究を人一倍積み重ねてきたのよ。
いや、違うか。それより前から、特にES4の頃からかなぁ
JSなんてと言われる声が大きかった時でも、
これからはJSの時代だ。JSを深く知ろう、そしてJSの良さをもっと知ってもらおう。
JSを良くしていこう。とずっとずーっと思ってたのよ。
だからES6の盛り上がりには喜んだし、
MLも当初から参加して全て読んで、細部だが提案にも参加した。
そして実装される前から、トランスパイラではなく、エンジン毎実装されているエミュレータでテストしたりしてきたのよ。
ブラウザに機能がコミットされたら、いやされる直前に自分でローカルでコミットして即ビルド。
とにかく誰よりもよくES6を知り、よく使えるようになろうと努力した。
というのは多少大袈裟だが、そのくらいの熱はあるよ。
0373デフォルトの名無しさん
2016/09/03(土) 22:59:14.75ID:N47o0j5/__proto__がサポートされていれば。
いや、それは言語名を拡大解釈しすぎだろ。
お前どう聞いてもそのノウハウないんだけど。
なんか書いたことある?アーキとしてライブラリ。
>>368
うん、文法上無理なものは、無理に使わないよ。
ライブラリはブラウザごとに違うよ?
当たり前だけど、そのブラウザ用に書いてるからパフォーマンス高いよ(笑)
0376デフォルトの名無しさん
2016/09/04(日) 01:41:38.94ID:dQFc65WQそんならネイティブで書いたほうがいっそ早くね?
0377デフォルトの名無しさん
2016/09/04(日) 01:42:25.34ID:dQFc65WQそれだと今度はOSのソースを読み出すのかな?
クラサバの話?
だいたい似たようなもんだよ。
社内端末は、何処の会社でもそうだろうけど、標準品のパターンしか無いから。
クラサバは基本的にはあんまり作らんけどね。
標準品があるがゆえにが、何かにもインストールするのは難しい。
毎月10日に数万人が同時使用するようなものもあるから、ウェブ向きのもあるんだけどね。
案件次第だけど、RedHatと、MSは調査させることができる保守契約だから、
ソースは見なくて済むよ。
0380デフォルトの名無しさん
2016/09/04(日) 02:40:24.68ID:dQFc65WQテストだけじゃなくてソースまで読むとなると、CPUとかグラフィックカードの設計図まで見ながら実装や結果が異なるかもしれない!とか言いながら開発してるのかな?
これとかは面白かったな
https://www.sophos.com/ja-jp/press-office/press-releases/2014/12/ns-browser-fingerprints-the-invisible-cookies-you-cant-delete.aspx
そのへんはウェブ屋がよくまとめてくれてるよ。
このCSSをONにしたら、アニメーションがGPU使ってる行われるので、適宜利用可能そうであれば取り込んでください、とかたまり来るな。
0382デフォルトの名無しさん
2016/09/05(月) 21:45:07.44ID:g6CwjeFOpdgを縮小とかって、どうやってやってるのでしょうか?
javascriptは関係ありますでしょうか?
https://smallpdf.com/jp
0383デフォルトの名無しさん
2016/09/05(月) 23:05:01.84ID:La2BdvKf{
0384デフォルトの名無しさん
2016/09/05(月) 23:10:26.66ID:La2BdvKfvoid func(int /*a*/)
{
....
}
void func(int a)
{
(void)a;
....
}
こんな風にしますが、JavaScriptだと定石みたいなのはありますか?
$('#element').on('mousedown', function(/*event*/) {
});
でよさそうな気がしますが、アロー関数の時は
$('#element').on('mousedown', /*event*/() => {
});
こんな風にしないとだめでかっこ悪いきがします。
0385デフォルトの名無しさん
2016/09/06(火) 00:15:41.30ID:vTB9MQXO未使用変数を必ず対処しないといけないということはない。
例えばイベントハンドラで引数にeventやeを取るのは「形」だ。
型宣言みたいなもんで、それを書いてあるからといって必ずしも
eventを利用しないことは皆知っている。
むしろその関数が別定義されていても、eventを受ける関数、
イベントハンドラの定義なんだと瞬時にわかるので意味がある。
つまりイベントハンドラとしてイベントを受け取るということだけで、
機能が満たされて意味的に「未使用」ではないとも見れる。
もしくは本当にイベントをトリガーとして関数を呼び出したいだけであれば、
引数を書かないでおくべき。
コメントアウトする文化はないのでけしてしてはいけない。
上で述べた引数をあえて書く、書かないは、関数の機能やニュアンスを表すための
弱い動的型付け言語における読み手に対する情報の追加だ。
しかしコメントアウトは書き手にとってのメタ的な情報でしか無い。
読み手に未使用変数の情報を伝えても何のプラスにもならないし、
何らかのニュアンスの提示かと思わせて混乱させるだけだ。
■ このスレッドは過去ログ倉庫に格納されています