B-Teck!

お仕事からゲームまで幅広く

【JavaScript/jQuery】We don't need jQuery?

昔書いてたメモが出てきたので、今更ですが供養。
正直今でも作り捨てとか、とりあえず作るならjQuery使ってもいいんじゃないかな?って思ってる。

jQueryとはなんだったのか

  • ブラウザ間でJavaScriptの実装が大きく異なっていた時代に、共通の実装が行えるように差異を吸収していたライブラリ。
    • ぶっちゃけ今でも差異はあるけど頑張れる範囲になってきた
  • 簡潔な実装からWebFront界隈で広く利用されており、jQueryに依存するライブラリも多数存在した。

なぜjQueryをやめるのか

不要なライブラリを読み込むことによる動作遅延

  • ただし70〜100KB前後なので、現在の通信環境ではほぼ問題なさそう

動作が遅い

  • jQueryはブラウザ間の差異を吸収するようにできているため、現代のブラウザには不要な分岐がある。
  • jQueryオブジェクト等の生成のコストもあり、現在の環境では不必要な処理が多い。
    • ついでにDOMを直接触るため、最近の仮想DOMを用いるフレームワークとの親和性が低い

jQueryでできていたことが、ES自体の仕様として取り込まれつつある

この辺参考
- jQueryのfindなどをquerySelectorで書く - Qiita
- You Don't Need jQuery - Qiita

jQueryで指定していたアニメーションがCSSで実現できるようになった

Pros/Cons

Pros

  • 不要なファイル(jQuery本体)を読み込まなくて良くなる
  • 本来必要ではない処理コストを削減できる
    • 標準APIに移行することでjQueryへのロックインがなくなり、他のフレームワークなどと組み合わせやすい
    • 近年流行っている仮想DOMとjQueryはだいぶ相性が悪い
  • スクリプトで行うべきこと、CSSで行うべきことの責務が明確になる

Cons

  • なんだかんだいってもjQueryの互換性担保は魅力
    • 現状、IE対応でPolyfillやBabelによるトランスパイルが必要となるケースはまだある
  • jQueryの方が記述が簡潔になるケースも多い
  • 長い間使われてきているプラグインにはjQuery必須のものもある
  • 小規模の開発ではjQuery使ってさっくり作るほうが良いこともある
    • VueやReactを入れるほどではない開発規模とか、標準APIだとまだ冗長になる部分とか

【雑記】勉強会に参加するのが難しい

みなさん、勉強会参加してますか?

勉強会のあとはしっかり懇親してますか?

 

私は、あんまり社外の勉強会などに顔を出せてないです。

原因はいくつかあるんですけど、主に2つで

・どうやって参加したい勉強会を観測すればいいのかわからない

・人見知りなので参加しても一言も会話せずに終わる

 

あたりでハードルを感じてます。

個人的な問題で割と常に金欠なので、懇親会に出れなかったり、チケット高めの勉強会やカンファに出れないというのもありますが…。

 

割とアクティブなエンジニアはどんどん露出して、前に出て、交流して、という感じで成長しているなと思ってるんですが、みんな最初からうまくできてたんですかね…

 

こういう気持ちで挑むのがいいよ〜とか、こういうふうに勉強会探してるよ!とかあれば、教えてもらえたらうれしいです

【Rust】Rust勉強-1 普遍的なプログラミング概念

普遍的なプログラミング概念 - The Rust Programming Languageの勉強メモ

1.1.1. 変数

変数宣言には let。デフォルトで不変でmutをつけると可変になる。
変数の参照には & をつける。参照も &mut とすることで可変にできる。
つまり、下記のようにすることで、Stringとして宣言したguessを可変の状態でread_line()に渡す事ができる。

let mut guess = String::new();
io::stdin().read_line(&mut guess)
    .expect("Failed to read line");

1.1.2. Result型

標準ライブラリにはResultと名前のついた型を返す。
Result型はenumで、成功した場合はOkを、失敗した場合はErrを保持する。
enumなのでそれぞれの列挙子から取り出すことも出来るが、Result.expect()を用いることで、
Okを取り出したのと同じ効果を得ることが出来る。
Result型は、Errが返却されたときの挙動を記述していない場合はコンパイラが警告を出す。

1.1.3. println!マクロのプレースホルダ

Rustのprintln!のプレースホルダは、文字列中に含めた{}で表現する。
変数は複数渡すことができ、渡した数に応じて文字列の先頭から{}に相当する値が挿入されていく。

1.1.4. crate

crateはRustのパッケージ。
ライブラリとして読み込んで利用できる。
cargoを利用したプロジェクトであれば、tomlのdependenciesに定義を足すだけで利用できる。
crate内の個別のtraitを利用するときには、スコープ内でuse rand::Rngなどしてやる必要がある

1.1.5. シャドーイング

Rustでは同じ名前の変数に値を上書きして置き換えることが出来るシャドーイングを利用できる。
値の変換などで利用される事が多い。
宣言済みの変数名に対してletで再度宣言することで行える。

1.1.6. タプル

複数の型をひとまとめにする型。パターンマッチングで分解もできる。
let tup: (i32, f64, u8) = (500, 6.4, 1);
タプルの要素に直接アクセスする場合はこう書く

tup.0 // 500
tup.1 // 6.4
tup.2 // 1

1.1.7. 配列型

同じ型をひとまとめにする型。Rustの配列は固定長であることに注意。

let months = ["January", "February", "March", "April", "May", "June", "July",
              "August", "September", "October", "November", "December"];

配列の要素にアクセスする場合は下記。

months[1]; // January

配列外アクセスを行った場合はpanicして終了する。

1.1.8. 関数

関数は文と式を含んだ形で定義される。
式の戻り値は値を返すので格納出来るが、文は戻り値が無い。
関数スコープの末尾の式の戻り値が関数の戻り値となる。
スコープの末尾の式は、行末にセミコロンを書かないことに注意。(書くと文として認識される)
returnキーワードを利用すればアーリーリターンを行うことも出来る。