├── .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 | website screenshot 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:
123 | angular1:
124 | ember: "{{#if shouldShow}}\n
\n{{/if}}" 125 | polymer: "\n" 126 | vue:
127 | riot:
128 | remarks: | 129 | - **Angular 2:** See [Angular Cheat Sheet](https://angular.io/docs/ts/latest/guide/cheatsheet.html). 130 | - label: Repeat 131 | frameworks: 132 | react: "items.map(item =>\n
\n)" 133 | angular2:
134 | angular1:
135 | ember: "{{#each items as |item|}}\n
\n{{/each}}" 136 | polymer: "\n" 137 | vue:
138 | riot:
139 | remarks: | 140 | - **Angular 1:** See [`ngRepeat`](https://docs.angularjs.org/api/ng/directive/ngRepeat). 141 | - **Polymer:** See [Template repeater (`dom-repeat`)](https://www.polymer-project.org/1.0/docs/devguide/templates.html#dom-repeat). 142 | - label: Bind event handler 143 | frameworks: 144 | react: