├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── _data
├── browserlabels.yml
├── browsers.yml
├── frameworks.yml
└── labels.yml
├── _layouts
└── default.html
├── browsers.md
├── hyperpolyglot.css
└── index.md
/.gitignore:
--------------------------------------------------------------------------------
1 | _site
2 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | ### New frameworks
2 |
3 | Please [create an issue](https://github.com/jeffcarp/frontend-hyperpolyglot/issues/new) proposing a new framework before submitting a PR. Currently the page is getting a bit wide. No new frameworks will be added until [#28](https://github.com/jeffcarp/frontend-hyperpolyglot/issues/28) is resolved.
4 |
5 | ### Local development
6 |
7 | This is a Jekyll app, so first [install Jekyll](https://jekyllrb.com/docs/installation/). Then, just run `jekyll serve --watch` and go to `localhost:4000`! :smile:
8 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Jeff Carpenter
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # frontend-hyperpolyglot
2 |
3 | Inspired by [hyperpolyglot.org](http://hyperpolyglot.org/), a comparison of similar features in popular JavaScript frameworks.
4 |
5 | At: http://jeffcarp.github.io/frontend-hyperpolyglot/
6 |
7 |
8 |
9 | See a bug or something missing? Have a framework in mind? Head on over to [CONTRIBUTING.md](CONTRIBUTING.md)!
10 |
--------------------------------------------------------------------------------
/_data/browserlabels.yml:
--------------------------------------------------------------------------------
1 | - Chromium
2 | - Firefox
3 |
--------------------------------------------------------------------------------
/_data/browsers.yml:
--------------------------------------------------------------------------------
1 | - name: Components
2 | comparisons:
3 | - label: Networking library
4 | browsers:
5 | chromium: Cronet
6 | firefox: Necko
7 | - label: TLS implementation
8 | browsers:
9 | chromium:
10 | linktext: BoringSSL
11 | link: https://www.chromium.org/Home/chromium-security/boringssl
12 | firefox:
13 | linktext: NSS
14 | link: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS
15 |
16 | - name: Developer Workflow
17 | comparisons:
18 | - label: Source control
19 | browsers:
20 | chromium: git
21 | firefox: mercurial
22 | - label: Continuous integration
23 | browsers:
24 | chromium:
25 | linktext: Commit Queue
26 | link: https://dev.chromium.org/developers/testing/commit-queue
27 | firefox:
28 | linktext: Docs
29 | link: https://developer.mozilla.org/en-US/docs/Mozilla/Continuous_integration
30 | - label: Running layout tests
31 | browsers:
32 | chromium:
33 | linktext: Docs
34 | link: https://chromium.googlesource.com/chromium/src/+/master/docs/layout_tests_linux.md
35 | firefox:
36 | linktext: Docs
37 | link:
38 | - label: Running Web Platform Tests
39 | browsers:
40 | chromium:
41 | linktext: Docs
42 | link:
43 | firefox:
44 | linktext: Docs
45 | link: https://developer.mozilla.org/en-US/docs/Mozilla/QA/web-platform-tests#Running_tests
46 |
--------------------------------------------------------------------------------
/_data/frameworks.yml:
--------------------------------------------------------------------------------
1 | - name:
2 | comparisons:
3 | - label: Version used
4 | frameworks:
5 | react: 15.0.2
6 | angular2: 2.0.0-beta.17
7 | angular1: 1.5.5
8 | ember: 2.5.1
9 | polymer: 1.4.0
10 | vue: 1.0.24
11 | riot: 2.4.1
12 | - label: Language used
13 | frameworks:
14 | react: ES6
15 | angular2: TypeScript
16 | angular1: ES5
17 | ember: ES6
18 | polymer: ES6
19 | vue: ES6
20 | riot: ES6
21 |
22 | - name: Templating logic
23 | comparisons:
24 | - label: Text interpolation
25 | frameworks:
26 | react: "{ message }"
27 | angular2: "{{ message }}"
28 | angular1: "{{ message }}"
29 | ember: "{{ message }}"
30 | polymer: "{{ message }}"
31 | vue: "{{ message }}"
32 | riot: "{ message }"
33 | remarks: |
34 | - **Polymer:** see [Binding to text content](https://www.polymer-project.org/1.0/docs/devguide/data-binding.html#binding-to-text-content).
35 | - label: Transform interpolation
36 | frameworks:
37 | react: "{ filter(message) }"
38 | angular2: "{{ message | filter }}"
39 | angular1: "{{ message | filter }}"
40 | ember: "{{filter message }}"
41 | polymer: "{{ filter(message) }}"
42 | vue: "{{ message | filter }}"
43 | riot: "{ filter(message) }"
44 | remarks: |
45 | **React, Riot and Polymer** don't have the concept of 'filters' or 'pipes', but you can use a simple function to acheive the same result.
46 |
47 | - **Vue:** See [Filters](https://vuejs.org/guide/syntax.html#Filters)
48 | - **Ember:** See [Helpers](https://guides.emberjs.com/v2.5.0/templates/handlebars-basics/#toc_helpers)
49 | - label: Transform with arguments
50 | frameworks:
51 | react: "{ filter(message, 'arg1', arg2) }"
52 | angular2: "{{ message | filter:'arg1':arg2 }}"
53 | angular1: "{{ message | filter:'arg1':arg2 }}"
54 | ember: "{{filter message 'arg1' arg2 }}"
55 | polymer: "{{ filter(message, 'arg1', arg2) }}"
56 | vue: "{{ message | filter 'arg1' arg2 }}"
57 | riot: "{ filter(message, 'arg1', arg2) }"
58 | remarks: |
59 | - **Angular 2:** See [Pipes](https://angular.io/docs/ts/latest/guide/pipes.html)
60 | - **Angular 1:** See [Filter](https://docs.angularjs.org/api/ng/filter/filter)
61 | - **Vue:** See [Filters](https://vuejs.org/guide/syntax.html#Filters)
62 | - **Ember:** See [Helpers](https://guides.emberjs.com/v2.5.0/templates/handlebars-basics/#toc_helpers)
63 | - label: Bind text content
64 | frameworks:
65 | react:
66 | angular2:
67 | angular1:
68 | ember:
69 | polymer:
70 | vue:
71 | riot:
72 | remarks: |
73 | A way of binding the text content of an element via an attribute.
74 |
75 | - **Angular 1:** See [`ngBind`](https://docs.angularjs.org/api/ng/directive/ngBind).
76 | - **Polymer:** See [Annotated attribute binding](https://www.polymer-project.org/1.0/docs/devguide/data-binding.html#attribute-binding.)
77 | - label: Bind href
78 | frameworks:
79 | react:
80 | angular2:
81 | angular1:
82 | ember:
83 | polymer:
84 | vue:
85 | riot:
86 | remarks: |
87 | - **Angular 2:** See [bind to the `href` property](https://angular.io/docs/ts/latest/cookbook/a1-a2-quick-reference.html#!#bind-to-the-href-property).
88 | - **Angular 1:** See [`ngHref`](https://docs.angularjs.org/api/ng/directive/ngHref).
89 | - **Polymer:** See [Binding to native element attributes](https://www.polymer-project.org/1.0/docs/devguide/data-binding.html#native-binding).
90 | - **Vue:** See [Directives > Arguments](https://vuejs.org/guide/syntax.html#Arguments).
91 | - label: Dangerous raw HTML output
92 | frameworks:
93 | react: ""
94 | angular2:
95 | angular1:
96 | ember: "{{{ raw_html }}}"
97 | polymer:
98 | vue: "{{{ raw_html }}}"
99 | riot:
100 | comment: see notes
101 | remarks: |
102 | Please don't use these in your programs. Filtering raw HTML on the server or in the browser will not protect you 100% against XSS. For a deeper look at the subject, please refer to the [Google Browser Security Handbook (PDF download)](https://storage.googleapis.com/google-code-attachments/browsersec/issue-8/comment-8/Google%20Browser%20Security%20Handbook.pdf) and the book [The Tangled Web: A Guide to Securing Modern Web Applications](http://lcamtuf.coredump.cx/tangled/).
103 |
104 | - **React:** See [Dangerously Set innerHTML](https://facebook.github.io/react/tips/dangerously-set-inner-html.html).
105 | - **Vue:** See [Raw HTML](https://vuejs.org/guide/syntax.html#Raw-HTML).
106 | - **Riot:** Riot doesn't directly support this, though you can set `innerHTML` using `this.root.querySelector`
107 | - label: Bind attribute value
108 | frameworks:
109 | react:
110 | angular2:
111 | angular1:
112 | ember:
113 | polymer:
114 | vue:
115 | riot:
116 | remarks: |
117 | - **Angular 2:** See [Attribute, class, and style bindings](https://angular.io/docs/ts/latest/guide/template-syntax.html#!#attribute-class-and-style-bindings)
118 | - **Vue:** See [Attributes](https://vuejs.org/guide/syntax.html#Attributes)
119 | - label: DOM add/remove
120 | frameworks:
121 | react: "{shouldShow && }"
122 | angular2: