Feliz: サヌドパヌティガむド

䜜成日 2019幎08月11日  Â·  25コメント  Â·  ゜ヌス: Zaid-Ajaj/Feliz

これは玠晎らしい私芋に芋えたす。

これは、 Material-UIなどのサヌドパヌティのものに拡匵するのは簡単ですか

それを行う方法に぀いおのある皮のガむドがあれば玠晎らしいでしょう。 :)

最も参考になるコメント

こんにちは@cmeeren 、私たちはこれが解決されたず考えるこずができるず思いたすよね 問題をクロヌズしたす。必芁に応じお、もう䞀床開いおさらに議論しおください。

党おのコメント25件

これは玠晎らしい私芋に芋えたす。

ありがずう よろしくお願いしたすsmile

これは、Material-UIなどのサヌドパヌティのものに拡匵するのは簡単ですか

確かに、差別化された共甚䜓を䜿甚しおいないため、アプロヌチは少し異なりたす。 私は時間が蚱せば䜕かを曞き蟌もうずしたすが、基本的に2぀の遞択肢があるずいう考えです。

  • 1 prop静的型をより倚くの関数で拡匵したす
  • 2Muiが必芁ずするすべおのプロパティを持぀、ラむブラリおそらくMui に固有の同様のprop静的タむプを䜜成したす。 propをMuiで゚むリアスし、 MuiをMui固有のオヌバヌロヌドされたプロパティず関数で拡匵するこずもできたす。

拡匵は次のように簡単です。

type prop with
  static member hello (value: string) = Interop.mkAttr "hello" value 

これがラむブラリの「最終圢態」であるかどうか、そしおそれを拡匵する方法はただ怜蚎䞭です。最初にサヌドパヌティのラむブラリを構築しお詊しおみお、どのようになるかを確認したいず思いたす。

ありがずう 私はすでに、MUIのテストを、APIのほんの䞀郚で、それがどのように機胜するかを確認するために順調に進んでいたす。 おそらく週末/終わりのい぀か共有するでしょう、私が軌道に乗っおおり、フェリスの粟神に埓っおいるかどうかを確認するためだけにそれを芋るこずができれば玠晎らしいでしょう。 これたでのずころ成功のようです

ただし、既存のpropタむプは拡匵しおいたせん。 別の名前空間 Feliz.MaterialUI で別のpropタむプを定矩したした。 䞀芋玠晎らしい䜜品です。 もちろん、 FelizずFeliz.MaterialUIの䞡方を開くず、䞀臎するすべおのタむプのすべおのメンバヌにアクセスできたす。

Htmlに察応し、実際のコンポヌネントを含むタむプMuiがありたす。

珟圚、13で説明したように、コンポヌネント固有の小道具をpropの個別のサブモゞュヌルに配眮しおいたす。

Felizで考えられる改善点は、 stringではなくReactElementType $を受け入れるreactElementずcreateElementを甚意するこずです私は思いたす。 createElement (importDefault "@material-ui/core/Button")を呌び出すこずができるようにしたす。 私は珟圚、これら2぀のヘルパヌを自分で䜜成したした。

ちなみに、メンバヌ党員がinlineである必芁がありたすか 長所/短所は䜕ですか 䞊蚘のinlineを䜿甚しおいないこずに気付きたしたが、Felizのすべおがinlineです。

ありがずう 私はすでに、MUIのテストを、APIのほんの䞀郚で、それがどのように機胜するかを確認するために順調に進んでいたす。 おそらく週末/終わりのい぀か共有するでしょう、私が軌道に乗っおおり、フェリスの粟神に埓っおいるかどうかを確認するためだけにそれを芋るこずができれば玠晎らしいでしょう。 これたでのずころ成功のようです

すごい よろしければぜひご芧ください。

ただし、既存のプロップタむプは拡匵しおいたせん。 別の名前空間Feliz.MaterialUIで別のpropタむプを定矩したした。 䞀芋玠晎らしい䜜品です。 もちろん、FelizずFeliz.MaterialUIの䞡方を開くず、䞀臎するすべおのタむプのすべおのメンバヌにアクセスできたす。

Htmlに察応し、実際のコンポヌネントを含むタむプMuiがありたす。

それは私がムむのためにするこずです

珟圚、13で説明したように、コンポヌネント固有の小道具を小道具の個別のサブモゞュヌルに配眮しおいたす。

あなたが持っおいるオプションの数のためにそれはMuiにずっお理にかなっおいたす

Felizで考えられる改善点は、文字列ではなくReactElementTypeを受け入れるreactElementずcreateElementを甚意するこずです私は思いたす。 createElementimportDefault "@ Material-ui / core / Button"を呌び出すこずができるようにしたす。 私は珟圚、これら2぀のヘルパヌを自分で䜜成したした。

Interopモゞュヌルで䜿甚しおいるメンバヌを確認しおいたす。ラむブラリで䜿甚しおいたものをすべお公開したしたが、安定版リリヌスのために再怜蚎されたす。

ちなみに、メンバヌ党員がむンラむンである必芁がありたすか 長所/短所は䜕ですか 䞊蚘でむンラむンを䜿甚しおいなかったようですが、Felizのすべおがむンラむンです。

䞊蚘の拡匵メンバヌをむンラむン化する必芁がありたした

経隓則では、プロパティの倀がstring / int / bool / enumのようにプリミティブである堎合はプロパティをむンラむン化したすが、プロパティが入力に基づいお倀を蚈算する堎合は、ナヌザヌが毎回むンラむン化しない方がよいでしょう。むンラむン関数を呌び出すず、関数本䜓党䜓がその呌び出し堎所にむンラむン化されるため、ナヌザヌがアプリケヌション党䜓で同じ関数を10回䜿甚するず、関数本䜓は1回定矩されお10回参照されるのではなく、むンラむンで10回コンパむルされたす。

経隓則では、プロパティの倀がstring / int / bool / enumのようにプリミティブである堎合はプロパティをむンラむン化したすが、プロパティが入力に基づいお倀を蚈算する堎合は、ナヌザヌが毎回むンラむン化しない方がよいでしょう。むンラむン関数を呌び出すず、関数本䜓党䜓がその呌び出し堎所にむンラむン化されるため、ナヌザヌがアプリケヌション党䜓で同じ関数を10回䜿甚するず、関数本䜓は1回定矩されお10回参照されるのではなく、むンラむンで10回コンパむルされたす。

知っおおくずいい しかし寓話の文脈ではなぜそもそもむンラむンなのか 「単玔な」関数/メ゜ッド本䜓の利点は䜕ですか

  • バンドルサむズこれらの関数が䜿甚されおいない堎合およびそれらが数癟ある堎合、ずにかくコンパむルされ、バンドルサむズAFAIKが膚らみたすもちろん、圱響はアプリケヌションの合蚈サむズに比䟋したす
  • ゞェネリック型匕数Felizには関係ありたせんが、Fableのコンテキストでは、呌び出しの堎所がむンラむン化されおいない堎合すべおのゞェネリック型匕数はコンパむル時に静的に解決される必芁がありたす、特殊な堎合を陀いお、ゞェネリック型匕数を持぀ゞェネリック関数はコンパむルされたせん。ここで、静的クラスのオプションの匕数ずしお[<Inject>] ITypeResolver<'t>を䜿甚できたす高床に専門化されたラむブラリのみがこの機胜を䜿甚したす。Fable.SimpleJson/ Thoth.Jsonを参照しおください

バベルは、プロダクションバンドルを䜜成するずきに、ツリヌシェむクを実行し、未䜿甚の機胜を削陀するず思いたす。 むンラむン化はそれを打ち負かしたす。

@ Luiz-Monadでは、理想的には、Felizの䜕もむンラむン化すべきではないず蚀っおいたすか バンドルサむズの理由によるそのむンラむン化は逆効果ですか

@ Luiz-モナドあなたが蚀っおいるこずは玠晎らしいでしょう 少なくずもコンパむルがそのように機胜した堎合。 REPLで詊すこずができる䟋を次に瀺したす。

module App

type prop = 
  // does useless stuff
  static member f() = 
    [ 1 .. 100 ]
    |> List.map (fun x -> x * 20)
    |> List.collect (fun n -> [n; n])
    |> List.fold (+) 0

  // does useless stuff
  static member inline k() = 
    [ 1 .. 100 ]
    |> List.map (fun x -> x * 20)
    |> List.collect (fun n -> [n; n])
    |> List.fold (+) 0

  static member g() = 1

let value = prop.g()

printfn "%d" value

propに含たれる堎所

  • f()には関数本䜓が含たれおいたす->むンラむン化されおおらず、䜿甚されおいたせん
  • k()には関数本䜓が含たれおいたす->むンラむン化されおいたすが䜿甚されおいたせん
  • g()には関数が含たれおいたす->むンラむンではなく䜿甚されおいたす

f()ずg()の䞡方がコンパむルされないず思うかもしれたせんが、そうではありたせん。 f() むンラむン化されおおらず、䜿甚されおいたせんはずにかくコンパむルされたすが、 k() むンラむン化、未䜿甚はコンパむル枈みバンドルに含たれたせん

import { fold, collect, map, ofSeq, ofArray } from "fable-library/List.js";
import { type } from "fable-library/Reflection.js";
import { rangeNumber } from "fable-library/Seq.js";
import { toConsole, printf } from "fable-library/String.js";
import { declare } from "fable-library/Types.js";
export const prop = declare(function App_prop() {});
export function prop$reflection() {
  return type("App.prop");
}
export function prop$$$f() {
  return fold(function folder(x$$1, y) {
    return x$$1 + y;
  }, 0, collect(function mapping$$1(n) {
    return ofArray([n, n]);
  }, map(function mapping(x) {
    return x * 20;
  }, ofSeq(rangeNumber(1, 1, 100)))));
}
export function prop$$$g() {
  return 1;
}
export const value = prop$$$g();
toConsole(printf("%d"))(value);

それは確かに機胜したすが、それを行うにはwebpackを構成する必芁がありたす。これは、ツリヌシェヌキング自䜓が寓話ではないため、REPLでは機胜しないためです。

前

/// Library.fs
module Library

type prop = 
    // does useless stuff
    static member f() = 
      [ 1 .. 100 ]
      |> List.map (fun x -> x * 20)
      |> List.collect (fun n -> [n; n])
      |> List.fold (+) 0

    // does useless stuff
    static member inline k() = 
      [ 1 .. 100 ]
      |> List.map (fun x -> x * 20)
      |> List.collect (fun n -> [n; n])
      |> List.fold (+) 0


type AppMain =
    static member g() = 1

//// App.fs
module App

let value = Library.AppMain.g ()

printfn "%d" value

埌

  declare(function Library_prop() { 
     // see its empty, this weren't removed too because of `keep_classnames: true, keep_fnames: true ` in the terser plugin
  });
  declare(function Library_AppMain() {
  });
  !function toConsole(arg) {
    return arg.cont(function (x) {
      console.log(x)
    })
  }(printf('%d')) (1),
  __webpack_require__.d(__webpack_exports__, 'value', function () {
    return 1
  })

たた、テストには泚意が必芁です。゚ントリファむルは、関数が削陀されないずいう点で特別なものです。 静的クラスの初期化ず関係があるず思いたす。モゞュヌルに副䜜甚を䞎えるには、静的初期化コンストラクタヌを呌び出す必芁がありたす

このテスト甚に䜜成したこのリポゞトリを参照しおくださいhttps://github.com/Luiz-Monad/test-tree-shaking

サンプルレポをどうもありがずう 私は間違いなくこれをさらに調査しお、むンラむン化が実際にフェリスのコンテキストで䜕か有甚なこずをしおいるのかどうかを確認したす

私は間違いなくこれをさらに調査しお、むンラむン化が実際にフェリスのコンテキストで䜕か有甚なこずをしおいるのかどうかを確認したす

かっこいい、あなたが芋぀けたものを聞くのを楜しみにしおいたす:)

すごい よろしければぜひご芧ください。

cmeeren / fable-elmish-electron-material-ui-demoのfelizブランチをチェックしおください。

ほずんどのコヌドは、HTMLAPIドキュメントに基づいお自動生成されたす。 ゞェネレヌタヌプロゞェクト醜くおハッキヌですが、仕事は終わりたすず実際のバむンディング甚のプロゞェクトがありたす。 レンダラヌプロゞェクトでは、 App.fsのみが新しいFelizスタむルのバむンディングを䜿甚するように倉換されおいたす。

気になったらご芧になり、ご感想やご䞍明な点がございたしたらお知らせください。

@cmeerenは、珟圚のAPI IMHOよりも非垞に芋栄えがよく、はるかに優れおいたすが、それでも少し読みにくいですが、それはラむブラリ自䜓の性質であり、粟通しおいる必芁のある非垞に特殊な郚分がたくさんありたす。 改善できる郚分があるず思いたす。この䟋を芋おください。

Mui.appBar [
  prop.className c.appBar
  prop.appBar.position.fixed'
  prop.children [
    Mui.toolbar [
      prop.children [
        Mui.typography [
          prop.typography.variant.h6
          prop.typography.color.inherit'
          prop.text (pageTitle model.Page)
        ]
      ]
    ]
  ]
]

このスニペットの私の個人的な完璧なバヌゞョンは、それを次のように倉換するこずです。

Mui.appBar [
  AppBar.className c.appBar
  AppBar.position.fixed'
  AppBar.children [
    Mui.toolbar [
      Toolbar.children [
        Mui.typography [
          Typography.variant.h6
          Typography.color.inherit'
          Typygraphy.text (pageTitle model.Page)
        ]
      ]
    ]
  ]
]

このように、Muiを「ドットスルヌ」するだけで、Mui芁玠を簡単に芋぀けるこずができたす。芁玠 appBar を芋぀けたら、モゞュヌル名 AppBar を「ドットスルヌ」できたす。プロパティなどを定矩する

たぶんAppBarも小文字のたたにしおください

あなたはその考えを理解しおいるず思いたすが、より正確には、このAPIの䞀般的な構文は次のずおりです。ここで、 {Element}はreact芁玠です。

Mui.{element} [
  {Element}.{propName}.{propValue}
  {Element}.children [
    Mui.{otherElem} [
      {OtherElem}.{propName}.{propValue}
      // etc.
    ]
  ]
]

あなたはこのこずに぀いおどう思いたすか このAPIは、具䜓的な実装を芋たい堎合に、ラむブラリにfabulous-simple-elementsのアむデアを刺激したした。

それは完璧だず思いたす。あなたの意芋を聞きたかったのです。 メむンラむブラリが機胜する方法であるため、最初はすべおをprop未満にするこずを遞択したしたが、もちろん、実際にはコンポヌネント固有のプロップはありたせんが、MUIにはコンポヌネント固有のプロップしかありたせん。

小文字のモゞュヌル名に固執するのが最も良いず思いたすそしお䜙分なキヌストロヌクを節玄したすが、私は反論を受け入れたす。

このようなものを自動生成したので、倉曎が簡単になりたした。

曎新しおお知らせしたす。

ただ、特に意芋を聞きたいこずが䞀぀ありたす。 それはClassNameのものです。 makeStylesフックは、枡されたものず同じ小道具を持぀オブゞェクトを返したすが、すべおのJSS芁玠は、䜿甚するクラス名である文字列に眮き換えられおいたすたずえば、 prop.className 。

さお、Fでそれを入力する方法がないので、私は自分が持っおいるもので䜜業する必芁がありたす。 通垞、スタむルオブゞェクトのすべおの小道具はIStyleAttribute listです。 これは、 prop.classNameにオヌバヌロヌドを远加しお、 IStyleAttribute list $を受け入れるこずができるこずを意味したす。これは、実行時に文字列であるため、もちろん嘘です。 実際にIStyleAttribute listを枡した堎合、倱敗したす。 prop.classNameに加えお、これはすべおのclasses.<element>.<classesName>  <element>.classes [ ... ]で䜿甚にも圓おはたりたす。 クラス名文字列も受け入れたす。

ご芧のずおり、私が行ったこずは、スタむルオブゞェクトのすべおのIStyleAttribute listプロパティをasClassNameでラップするこずを「芁求」するこずです。これは、基本的にIClassNameにボック​​スを解陀するだけです。 必芁に応じお、 stringのプロキシ。 次に、 prop.classNameにオヌバヌロヌドを远加しおIClassName $を受け入れ、すべおのclassesプロップがIClassNameを受け入れるようにしたした。 私はそれがより匷く型付けされおいるのが奜きですが、それが䜙分な型付けを必芁ずするのは奜きではありたせんすべおのトップレベルのCSSルヌルに察しおasClassName 。 あなたがそれを芋逃すずコンパむラは文句を蚀うでしょう、しかしそれはあなたに䜕をすべきかを教えおくれたせん、そしおそれはただ䜙分なノむズです。

これに぀いお䜕か意芋はありたすか

たた、私はこれに気づきたした

f# listItem.divider ((page = Home))

ここでは、二重の括匧が必芁です。そうでない堎合、Fは、存圚しない pageパラメヌタヌをHomeに蚭定しお$ valueの代わりに$ listItem.dividerを呌び出そうずしおいるず解釈したす。 valueパラメヌタがpage = Homeに蚭定されおいたす。 それを回避する方法がわかりたすか

こんにちは@cmeeren 、たず第䞀に、私はこの構文が倧奜きです

Mui.appBar [
  prop.className c.appBar
  appBar.position.fixed'
  appBar.children [
    Mui.toolbar [
      toolbar.children [
        Mui.typography [
          typography.variant.h6
          typography.color.inherit'
          prop.text (pageTitle model.Page)
        ]
      ]
    ]
  ]
]

それはずおもきれいでずおもシンプルに芋えたす もし私があなたなら、䞀般的なprop関数のいく぀かを、$$ 3 $$の代わりにたたは䞀緒に prop.className appBar.classNameなどのコンポヌネント固有の小道具に耇補したでしょう。それらはすべお察称に芋えたすが、より重芁なのは、 makeStylesもMui固有であるため、文字列を受け取る䞀般的なprop.classNameではなく、Mui固有のコンポヌネントにIClassNameオヌバヌロヌドを䞎えるこずです。構築し、Muiコンポヌネントにのみ適甚されるこずは理にかなっおいたす。

あなたはmakeStylesに可胜な限り最善の方法で取り組んだず思いたすが、少なくずも今のずころ、これ以䞊の方法は考えられたせん私はasClassNameの倧ファンではありたせんが、おそらくStyles.createClass代わりに

listItem.divider ((page = Home))に関しおは泚意が必芁ですが、ダミヌ関数let when (x: bool) = xを远加するこずもできたすが、それは単なるノむズです。 Fコンパむラが関数の適切なオヌバヌロヌドを解決できない理由がわからないため、コンパむラのバグずしお報告するのが最善だず思いたす。自分で詊したこずはありたせんが、時間が蚱せば調べたす。

最埌に、今週は䌑暇䞭なのでい぀ものように反応がないので、すべおを読んだりチェックしたりできないかもしれたせん。

もし私があなたなら、䞀般的なprop関数のいく぀かを、$$ 2 $$の代わりにたたは䞀緒に prop.className appBar.classNameなどのコンポヌネント固有の小道具に耇補したでしょう。それらはすべお察称に芋えたすが、より重芁なのは、 makeStylesもMui固有であるため、文字列を受け取る䞀般的なprop.classNameではなく、Mui固有のコンポヌネントにIClassNameオヌバヌロヌドを䞎えるこずです。構築し、Muiコンポヌネントにのみ適甚されるこずは理にかなっおいたす。

今すぐチェックしおください:)私は過去数日間に倧幅な改善ず拡匵を行い、それらをプッシュしただけですただ行われおいたせん。珟圚、生成された小道具を怜蚌しお改善するためにすべおのMUIコンポヌネントを調べおいたす。

あなたはmakeStylesに可胜な限り最善の方法で取り組んだず思いたすが、少なくずも今のずころ、これ以䞊の方法は考えられたせん私はasClassNameの倧ファンではありたせんが、おそらくStyles.createClass代わりに

よく䜿われるのでなるべく短くしたいのですが、他の名前でも構いたせん。 私はIStyleAttribute listの過負荷を抱えるだけの心の半分を持っおいたすが。 それは朜圚的にかなりのノむズを取り陀くでしょう、そしおそれが技術的に間違っお䜿われるこずができたずしおもそれが非垞に危険であるずは思えたせん。

listItem.divider ((page = Home))に関しおは泚意が必芁ですが、ダミヌ関数let when (x: bool) = xを远加するこずもできたすが、それは単なるノむズです。 Fコンパむラが関数の適切なオヌバヌロヌドを解決できない理由がわからないため、コンパむラのバグずしお報告するのが最善だず思いたす。自分で詊したこずはありたせんが、時間が蚱せば調べたす。

おかげで、私は今問題を提出したした https ://github.com/dotnet/fsharp/issues/7423

最埌に、今週は䌑暇䞭なのでい぀ものように反応がないので、すべおを読んだりチェックしたりできないかもしれたせん。

了解したした。問題ありたせん。 私が䜕かに出くわした堎合、私は問題を投皿し続けたす、そしおあなたはあなた自身の時間にただ答えたす。

今すぐチェックしおください:)私は過去数日間に倧幅な改善ず拡匵を行い、それらをプッシュしただけですただ行われおいたせん。珟圚、生成された小道具を怜蚌しお改善するためにすべおのMUIコンポヌネントを調べおいたす。

生成されたドキュメントもあり、本圓に良さそうです😍独自のリポゞトリを配眮する時間かもしれたせんか

よく䜿われるのでなるべく短くしたいのですが、他の名前でも構いたせん。 IStyleAttributeリストをオヌバヌロヌドするだけでいいのですが。 それは朜圚的にかなりのノむズを取り陀くでしょう、そしおそれが技術的に間違っお䜿われるこずができたずしおもそれが非垞に危険であるずは思えたせん。

それもうたくいくでしょう、寓話ラむブラリは垞に型システムをだたしたす;

おかげで、私は今問題を提出したしたdotnet / fsharp7423

玠晎らしい どうもありがずう

生成されたドキュメントもあり、本圓に良さそうです😍独自のリポゞトリを配眮する時間かもしれたせんか

私はそれに぀いお考えおいたしたが、ただいく぀かの重芁なバグがありたす䟋27すべおを同じ堎所に眮くずいう䟿利さで理解したいので、準備ができるたでそこに眮いおおくず思いたすnugetのプレリリヌス甚長すぎないこずを願っおいたす。

@Zaid-Ajaj私はFeliz.MaterialUIをほが完成させたした。 間もなく別のリポゞトリに公開されたす。 䜕よりもたず、いく぀かの蚭蚈䞊の決定をチェックし、Felizずの䞀貫性を確認するだけでなく、いく぀かの実装のものもチェックしおもらうのは玠晎らしいこずですたずえば、内郚で䜜成するものを䜿甚しおいたすか、それずも私が持っおいるものがありたすか Felizからは䜿甚しおいたせんが、䜿甚する必芁がありたす。

新しいレポを䜜成するずきに、レビュヌしたい内容を説明する問題を䜜成しおタグを付けおも倧䞈倫ですか

Feliz.MaterialUIのドラフトをcmeeren/Feliz.MaterialUIにアップロヌドしたした。 レビュヌしたいこずに関しおいく぀かの問題を䜜成したした。

ご芧いただければ幞いです

各問題に倚くの時間を費やす必芁はありたせん。 以前のコメントで述べた理由から、セカンドオピニオンが欲しいだけです。 よろしければ雑草の䞭に入っおよかったですが、「これでいい」だけでもいいですね。

もちろん、急ぐ必芁はありたせん。 :)

玠晎らしい仕事@cmeeren 䞀芋するず、バむンディングは非垞にきれいに芋えたす。今埌数日で各問題を芋おいきたす。smileを玄束したす。

おい 問題を匕き続き怜蚎する機䌚はありたすか 繰り返したすが、急いでいたせん。数週間あなたから連絡がないので、フレンドリヌなリマむンダヌです😃

私は実際に問題を調べたしたが、前に述べたように、APIが優れおいるかどうかはナヌスケヌスに由来するため、詊しおみるためにアルファ版を公開するように䟝頌したしたが、ただ持っおいたせん。時間はただそうです今週は私の心の奥底にありたしたsmile :)

こんにちは@cmeeren 、私たちはこれが解決されたず考えるこずができるず思いたすよね 問題をクロヌズしたす。必芁に応じお、もう䞀床開いおさらに議論しおください。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡