-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
mjsって何でしょう? #94
Comments
@satakagi |
ES Modules (.mjs) を使って開発する例: ブラウザー上で従来 <script type="module">
import ADT7410 from "./adt7410.mjs";
</script> あるいは <script type="module" src="./main.js"></script> main.js import ADT7410 from "./adt7410.mjs"; もしGitHubにあるmasterブランチのファイルを参照するのであれば、 import ADT7410 from "https://cdn.jsdelivr.net/gh/chirimen-oh/chirimen-drivers@master/packages/adt7410/adt7410.mjs"; など。 |
ES Modules そのものは、現代の多くのブラウザーでは利用可能ではあり、また、Node.jsに関してもv15以降は正式にサポートされるようなので、Universal JS を目指していくという観点では私個人としてはおすすめしておきたいところですがいかがでしょうか。 |
チュートリアルやExamplesの<script>の記述なども奇麗にmjsや、ESModules?import?に直した状態にするのであれば良いのですが、そうでない今の状況ですと開発の手間がかかりそう(このままExamplesやチュートリアルが従来のままだと、人力でimportから<script>に書き換えたりなどいろいろやらないとならないですよね? 多分typoの嵐) 非同期の書き方をasync awaitを使うことを決めたときも、 古典的なjavasctiptに無いものなので、ドキュメントなどをいろいろケアしたうえで全面適用することにしましたので、今回もこれに変更したいのであればそういうケアが必要だと思います。 |
https://github.com/chirimen-oh/chirimen-drivers/tree/master/examples に提供している内容で問題ないかなと考えています。 |
たしかにそうですね。。。 > 今回もこれに変更したいのであればそういうケアが必要だと思います。 |
その点は UMD によってサポートしていくつもりで考えていました。 |
https://github.com/chirimen-oh/chirimen-drivers/tree/master/examples よくわからないのですが、私の場合、これまではchirimen(-rip3)やchirimen-microbitのExampolesを自分の持っているホスティング(svg2.mbsrv.net)にコピーしたものでExamples(ドライバ含む)のトライアンドエラー開発を行っています。そのためコードの本家はjsです。 |
特に今ISSUEに上がっていたような既存のドライバのバグや改善を考えると、マスターがどれなのかをきちんと決めておかないと カオスになるので、 |
従来のJSで開発進めるということであれば、Node.jsにも対応しているUMDフォーマットでの開発をおすすめしたいです。 (function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.ここにクラスの名前 = factory());
}(this, (function () { 'use strict';
// ここに本体
}))); 私個人の考えとしては、ESMのサポートはおすすめですが、ブラウザーとNode.js両方をサポートしてくUniversalなJSモジュールが提供されているのであれば本リポジトリとしてはどっちでもよいかなと考えていました。 |
一方で https://github.com/chirimen-oh/chirimen.org に関しては、たしかに今後の方針を合意とってどちらか決めていくほうがよいとも思いました。 |
jsを本家にして、そこからmjsが生成できるなら、どっちでもいい開発スタイルになると思いますが、その辺はどうなのでしょう? 今はmjsからjsを生成してる感じですよね? |
調べたことないですね。。。 |
はい |
であれば少なくとも私は厳しいなぁと思います。>mjs, ESModule |
お、UMDというものもあるのですね。 |
いいえ、必要ないです |
はい、そのとおりです。 |
はい、私もNode,jsで使えるようになったことはすごく良いことだと思っています。(実用的になりましたよね!) |
あとテストをどうするかも課題かな。全部の環境でドライバのテストを行う必要があるのか? >これかなりハードル高い https://github.com/chirimen-oh/chirimen-drivers/tree/master/examples |
Raspberry Pi/CHIRIMENブラウザーのものを配置しています |
ESMであること、あるいはUMDであること、いずれかが保証されているのであればある環境のみで十分と考えます |
とすると、 |
ちなみに、UMDって あらゆるjsで例外なく ↑をコピペすれば成立するのでしょうか? |
今後は、Raspberry Pi用のExamplesは あ、そうするとmicrobitのものも同じく |
browser/node 両対応をするという意味でも、 (async/await を教えるのと同じく)徐々に標準として広く使われるようになっていくモジュール (ES Module のほう) でコードを読み書きすることを教えるという意味でも、モジュールのコードと記法に徐々に移行していく必要はあると考えています。 しかし、今回ご迷惑をおかけしてしまったように、モジュールやその歴史的経緯などを理解・把握して後方互換用のコード (UMD) の生成手順までを全て理解するのは正直大変だと思います。 その大変さは分かっている人がケアして、普通に CHIRIMEN を使う人やドライバを書いてくれる貢献者にはなるべく苦労をかけないようにしないと不味いとは思います。移行作業自体が大変でそのケアまでが間に合ってないままで申し訳ないです。 大まかに言って困るポイントはこの辺りでしょうか CHIRIMEN 利用者今のところチュートリアルなどは基本旧来のブラウザ向けのものだけの想定で書いてもらって、モジュールについては意識しないで済むようにしています。 但し、そうするためにドライバ開発側は ESM でコードを書くだけでなく、UMD 形式に変換したものを用意する必要がある状態になっています。 モジュールの利用が浸透してくるときか何処かのタイミングで (async/await を導入したように) チュートリアル/example もモジュールに切り替えたい・切り替えるべきと考えています (がその場合でも後方互換・これまでの使い方の人のために UMD 形式の生成は必要)。 ドライバ開発者node/browser 両対応にするには ES Module で実装・開発する必要があるため、どうしても次の 2 点の手間が増えてしまいます (通常の任意の js から ES Module を生成する手段は存在しないはず。一定のルールの中のものだけ変換できるならあり得るけどそれなら最初から ES module でかいた方が良い)。
この点についての丁寧な説明や負荷軽減のための対応や合意が無いままで進めてしまったのが問題でした。申し訳ありません。 前者については、@kou029w さんが最初に書いた ように、 後者については yarn build できる環境を用意するのが大変なケースもあるので、Github Actions などで自動生成・コミットできると良いかもです。議論頂いたように、ES Module として正しく動いてれば UMD として改めて動作確認は不要 (変換による非互換は無い) なので。 |
ですよね。なんか凄いハックコード書けば例外はあるかもですが、やってることは単純なので任意の JS が書けます。といっても冒頭のテンプレにクラス名を書かなきゃダメとか、本体という部分の最後で return してあげなきゃとか結局「UMD としてドライバを書くための手順」を覚える必要があるかと思います。 ES Module を browser/node がサポートするまでの間の過渡期に、何とかして単一 JS ファイルで両サポート強いようとして生まれた気持ち悪いテンプレと記法なので、リリースファイルとして UMD を提供するのは良いけど、開発・実装者が直接 UMD を書く・書き方を学ぶのはもうしないで、ES Module (mjs) を書いて import した方が簡単かつ今後の Web 開発一般で役立つ・見かけることが増える記法で良いかと思います。 そのためには既存の example は script タグと import 行の修正が必要で手間がかかるので、example/tutorial も ESM 化したいところで、そうしたものが https://github.com/chirimen-oh/chirimen-drivers/tree/master/examples とも言えます (main.js で import する先のパスだけ変えれば開発版で試せる)。じゃぁ
については、そうしてしまいたいところだけど、そうするとチュートリアルの方も全面的に ESM/import の利用にしないとチュートリアル本文と example のコードの書き方が違って理解できないという問題が発生してしまいます。 私の認識では example の公式マスター?はまだ旧来の 今のところ、メンテナだけが何とかすれば良いドライバは ESM がオリジナルという方式に切り替えたが、一般の CHIRIMEN 利用者 (ESM/import 知らない人も多い) の方までは切り替える判断はできていない (こちらはちゃんとコミュニティの相違で切り替えないとならないと意識して勝手にはしないでいる) 状態です。 example の方も ESM/import でオリジナル書いたら今の旧来の形式が自動生成されるようにできれば良いのですが、それもできておらず結局 examples が 2 つになってしまった状態です。 node 対応などと共にモジュール化の導入をしながらちゃんとコミュニティでの説明・フォローなどができていなかったところは、明日説明・議論させてください。 |
私としては CHIRIMEN コミュニティは初学者向けのプログラミング環境であるので、利用者側であれ、ドライバ開発社側であれ、日常的にハックコードを書くことはせず、標準化されたコードだけを学んで開発ができるようにすべきと考えています。 そういう意味では ADM/CMD などは中身を読まずにドライバとして その意味で @kou029w さんの選定、セットアップには私も賛成しています。説明と合意が足りてなかった所は申し訳ありません。ミーティングでの説明やドキュメントの書き足しなどでフォローさせてください。 |
ESM の案内・以降手順を書く話については単独 issue に分けました: #95 |
方向性としては共感できるのですが、開発の手間を考えるとやはり抵抗感が強いですね。 理由はドライバ開発用のテストとExamples(こちらもこちらで別にテストも必要)の二つを作らないと仕事が完了しないところです。 トライアンドエラーなしにドライバが書けるなら大した手間ではないのかもしれませんが、そうはいきませんのでドライバを書くときには当然テスト用のwebAppsとセットで書いていきます。 あ、その意味で、 やはりもしESM化するならば、利用者向けのExamplesも含めて一斉にすべきと思います。(もちろん利用者向けのESMの説明も整備したうえで)それまではESM化は先送りする。 利用者向けのExamplesは誰かが別途 新規ドライバが登録されるたびに各環境用のものをこまめにケアして用意(こちらも当然そのたびにテストが必須)してくれるというのであれば良いのかもしれませんが、それは難しいと思います。 特にバグレポートがきた時の対応を考えると・・・ 実際にこのところPCA9685のドライバとMPU9250のドライバのデバッグをして登録する作業をしましたが、これは厳しいと思いました。(両方ともmjsではなくjsの方を書き換えてしまいましたし・・・) |
いえ、開発・デバッグする時点から ESM で書き、サンプルアプリ (example) もその mjs ファイルを直接 import する ( 変換はあくまでも従来の
ESM (mjs) を import で読むのも変換後の CMD (js) を読むのもアプリの挙動としては一致するので、テストアプリの中身を変えない限りはドライバの変更をしても変換後の方の再テストは不要です。 とはいえ、ドライバだけでなく example アプリ側も一度リリースしてからも何度も書き換えながらやるということであれば、リリース毎に手間が発生してしまうのは仰るとおりです。 それを避けるためにはやはり仰るとおり、tutorial/example もまとめて全部 ESM に移行する、そのために説明をちゃんと書いていくという方針になるかと思います。 |
あ、これは理解できていると思います。問題にしているのは、利用者が使用するExamplesの方(RPiとかmicrobitとかのリポジトリの方に同梱されている方)です。
そうですね。たとえば、先ほどMPU6500のドライバにgetTemperature()という機能を追加しました。これのテストは しかし、Rpi3の中の利用者用のExamples tutorial/example もまとめて全部 ESM に移行でないと、ちょっと私だけでは面倒見れないように思いますね。 もしくは、これから新しく追加するデバイスについては、 利用者用のExamplesは、このhttps://github.com/chirimen-oh/chirimen-drivers/tree/master/examples #結果的には「なし崩し的な」ESMへの全面移行 ということです^^; これなら対応できるかも。 |
そうですね、仰るとおり
が分かれてて両方更新し続けるのが辛いのが問題ですね。 実際今は driver の修正以外は user example 側だけメンテ更新されてることもあるが、driver の機能拡張となると user example にも反映したいし... などとなっていると思います。(ホントに必要な時だけ or ちゃんと覚えてるときだけ両対応という感じでやってるのが現状という気がします)
はい。今までのコーディングルール変更も、可能なときはある程度一括して実施しているが、順次段階的に直しているものなどもあったりするので、方式が複数あるよと言うことを説明、SHT30 だけ (grove もチュートリアルの該当ページだけ残したように) 両方用意するが他は段階的に移行などはあり得ると思います。 もちろん、時間が取れるタイミングで機能追加など無いデバイスもどんどん移行させていき、適当なタイミングで tutorial 標準も ESM 中心にするというような。 |
note: チュートリアルを ESM (mjs 直接読み込み) に移行する場合 jsbin/jsfiddle という ESM 非互換環境が邪魔だったのだが CSB に移行してめでたく deprecated (2019 アーカイブに移行) させたので、チュートリアル/example を ESM 化する邪魔者は多分もう無い。 |
CHIRIMEN RPi3はスタンドアロンで動かしたいというニーズがあったのでExamplesがあるけれど、 |
@dynamis 基本的にモジュールに全面移行するとなったので、拡張子でmjsを使う必要性は薄い(jsのままにすべき)と思うのですがどうでしょう。 |
私は拡張子を.jsとすることに異論ありません。 例: 下記のように {
"main": "index.js",
"type": "module",
} |
|
逆に言えばこれだけでしたよね。 過渡期の課題に対するものとして .mjs だったもので、既に Node 14 以降なら package.json で指定すれば済む世界になってきてること、CHIRIMEN のメインは browser 側の利用と思うと js にするという対応で良い (良かった) と思います。 |
micro:bit , RPi用の*.jsのドライバ*1を開発している範囲ではmjsという拡張子のコードは使わないので、よくわかりません。コードを見てみると、ほとんど同じなので、どちらかから自動生成しているように見えるのですがよくわからないので説明を。
1から何か自動的にmjsが生成できるのならばあまり気にはなりませんが、逆にmjsを作らないとjsを登録できないとかになりますと、私の開発スタイル(.jsのコードを直接いじってmicrobitやRPiでトライアンドエラーする)からするとかな~り面倒です。
The text was updated successfully, but these errors were encountered: