From e9035fb9bd770da702c3efc304b1fac172fc3e10 Mon Sep 17 00:00:00 2001 From: Cody Lindley Date: Mon, 15 Jan 2018 21:41:16 -0700 Subject: [PATCH] updates --- 2018.md | 1 + SUMMARY.md | 3 +-- images/vscode.png | Bin 0 -> 65356 bytes learning/offline.md | 1 + learning/react.md | 2 +- recap.md | 8 +++++--- tools/animation.md | 2 ++ tools/apps.md | 41 ++++------------------------------------- tools/browser.md | 9 +++++++-- tools/cms.md | 13 +++++++------ tools/code-editor.md | 10 +++++++--- tools/comm.md | 1 - tools/db.md | 3 +-- tools/dev-tools.md | 5 +---- tools/diagram.md | 1 + tools/hosting.md | 4 ++-- tools/html.md | 3 --- tools/offline.md | 6 ++++++ tools/proto.md | 5 ++++- tools/pwa.md | 4 +--- tools/static.md | 2 +- tools/templates.md | 9 +++++---- tools/testing.md | 21 +-------------------- tools/ui.md | 17 +++++------------ 24 files changed, 64 insertions(+), 107 deletions(-) create mode 100644 images/vscode.png diff --git a/2018.md b/2018.md index b1d7017..4981644 100644 --- a/2018.md +++ b/2018.md @@ -7,6 +7,7 @@ * Keep an eye on [turbo](https://medium.com/@ericsimons/introducing-turbo-5x-faster-than-yarn-npm-and-runs-natively-in-browser-cc2c39715403). * Expect CSS Flebbox, grid, ... Learn them. * [JavaScript usage will continue to grow](https://insights.stackoverflow.com/survey/2017#technology-programming-languages) with no [slowdown in sight](https://insights.stackoverflow.com/survey/2017#technology-most-popular-languages-by-occupation). +* The next step for WebAssembly will be tooling. It's coming. *** diff --git a/SUMMARY.md b/SUMMARY.md index 8c94917..d427301 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -77,8 +77,7 @@ * [App Frameworks (Desktop, Mobile etc.) Tools](tools/apps.md) * [State Management Tools](tools/state.md) * [Progressive Web App Tools](tools/pwa.md) - * [Scaffolding Tools](tools/scaffolding.md) - * [General FE Development Tools](tools/dev-tools.md) + * [GUI Development/Build Tools](tools/dev-tools.md) * [Templating/Data Binding Tools](tools/templates.md) * [UI Widget & Component Toolkits](tools/ui.md) * [Data Visualization (e.g., Charts) Tools](tools/charting.md) diff --git a/images/vscode.png b/images/vscode.png new file mode 100644 index 0000000000000000000000000000000000000000..231e21d4eb80d89b0ed0197f94488a7b76fe6289 GIT binary patch literal 65356 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 F{2Pkb$6^2g literal 0 HcmV?d00001 diff --git a/learning/offline.md b/learning/offline.md index 6114e8a..379143e 100644 --- a/learning/offline.md +++ b/learning/offline.md @@ -9,6 +9,7 @@ Offline development (aka offline first) is an area of knowledge and discussion a * [Offline First](http://www.webdirections.org/offlineworkshop/ibooksDraft.pdf) [read] * [offlinefirst.org](http://offlinefirst.org) [read] * [The Offline Cookbook](https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/) [read] +* [Offline Quickstart](https://developers.google.com/web/ilt/pwa/offline-quickstart)[read] diff --git a/learning/react.md b/learning/react.md index a1a38e2..58da6e2 100644 --- a/learning/react.md +++ b/learning/react.md @@ -25,7 +25,7 @@ ###### NOTES: -Once you have a good handle on React you might consider looking at [Preact](https://preactjs.com/) or [Inferno](https://infernojs.org/), or both. When you have Redux mastered, take a look [MobX](https://mobx.js.org/) or consider creating your own small custom Redux like implementation from scratch. +Once you have a good handle on React move on to learning a more robust state management solution like [MobX](https://mobx.js.org/). If you are an experienced developer with Functional Programming knowledge look at [Redux](https://redux.js.org/). If you need help understanding the role of state management beyond React's `setState` watch, "[Advanced State Management in React (feat. Redux and MobX)](https://frontendmasters.com/courses/react-state/)". diff --git a/recap.md b/recap.md index 3d75aaf..42b4473 100644 --- a/recap.md +++ b/recap.md @@ -13,7 +13,7 @@ * The [great](https://medium.com/@jerrylowm/the-death-of-front-end-developers-803a95e0f411) divide between a front-end HTML & CSS developer v.s. [front-end application developer is realized/verbalized](https://medium.com/@mandy.michael/is-there-any-value-in-people-who-cannot-write-javascript-d0a66b16de06). * This year seemed fuller than most of solutions trying to contend with the mainstream javascript app tools (i.e. [React, Angular, and Vue etc...](https://stateofjs.com/2017/front-end/results)) Let me list them for you. [Moon](http://moonjs.ga/docs/overview.html), [Marko](https://markojs.com/), [Hyperapp](https://github.com/hyperapp/hyperapp), [Quasar Framework](http://quasar-framework.org/), [POI](https://poi.js.org), [frint](https://frint.js.org/), [BunnyJS](https://bunnyjs.com/), [jsblocks](http://jsblocks.com/), [Sapper](https://sapper.svelte.technology/), [Stimulus](https://github.com/stimulusjs/stimulus), [Choo](https://github.com/choojs/choo), * This was the year that jsbin and jsfiddle evolved to things like [StackBliz](https://stackblitz.com/) and [codeSandbox](https://codesandbox.io/). Making it dead simple to share a working React app. -* React continues to be flattered by things like [preact](https://preactjs.com/), [inferno](https://infernojs.org/), [nerv](https://github.com/NervJS/nerv) and [rax](https://github.com/alibaba/rax). +* React continues to be flattered by things like [preact](https://preactjs.com/), [inferno](https://infernojs.org/), [nerv](https://github.com/NervJS/nerv), [dva](https://github.com/dvajs/dva), and [rax](https://github.com/alibaba/rax). * Cheatsheets got organized with [devhints.io](https://devhints.io/). * We figured out that the correct pattern for an app boilerplate/cli tool is something very opinionated like [React Create App](https://github.com/facebookincubator/create-react-app) with the ability to [escape](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#npm-run-eject) from it when needed. * Most developers have found that the combination of a really good code editor and eslint and [prettier](https://github.com/prettier/prettier) plugins make writing code faster and easier. @@ -23,9 +23,10 @@ * CSS [revolutions/revolts](http://ryanogles.by/css/javascript/2017/05/25/the-state-of-css.html) are under way. * JavaScript explorer tools have arrived, [JavaScript Array Explorer](https://sdras.github.io/array-explorer/) and [JavaScript Object Explorer](https://sdras.github.io/object-explorer/). This is a handy interface pattern for learning about JavaScript data types (e.g. Objects and Arrays) and their methods. -* The [Chrome web browser dominates the market](http://gs.statcounter.com/browser-market-share) and people begin to fear [repeating the past](https://www.theverge.com/2018/1/4/16805216/google-chrome-only-sites-internet-explorer-6-web-standards). +* The [Chrome web browser dominates the market](http://gs.statcounter.com/browser-market-share) and people begin to fear the past might be [repeating itself](https://www.theverge.com/2018/1/4/16805216/google-chrome-only-sites-internet-explorer-6-web-standards). * [Brave](https://brave.com/) becomes the most pleasant and safest way to browser the internet. -* [PhantomJS is no longer maintained](https://www.infoq.com/news/2017/04/Phantomjs-future-uncertain), [Headless Chrome](https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md) steps in. +* [PhantomJS is no longer maintained](https://www.infoq.com/news/2017/04/Phantomjs-future-uncertain), [Headless Chrome](https://chromium.googlesource.com/chromium/src/+/lkgr/headless/README.md) and [Puppeteer](https://github.com/GoogleChrome/puppeteer) step in. +* [Prettier](https://prettier.io/) comes from left field and becomes a stable for development. *** @@ -70,3 +71,4 @@ and [JavaScript Object Explorer](https://sdras.github.io/object-explorer/). This * [Firebug officially dead](https://github.com/firebug/firebug). * CSS [20 years young](https://www.w3.org/Style/CSS20/) in 2016. * [Immutability](https://facebook.github.io/immutable-js/) concepts run rapid. + diff --git a/tools/animation.md b/tools/animation.md index 377814a..3098405 100644 --- a/tools/animation.md +++ b/tools/animation.md @@ -1,5 +1,7 @@ # Animation Tools +##### CSS and JavaScript Utilities: + * [Animate Plus](https://github.com/bendc/animateplus) * [Animate](https://github.com/daneden/animate.css) * [Anime.js](http://animejs.com/) diff --git a/tools/apps.md b/tools/apps.md index fcc5bb4..e4a58cb 100644 --- a/tools/apps.md +++ b/tools/apps.md @@ -23,24 +23,16 @@ These solutions typically use [Cordova](https://cordova.apache.org/), [crosswalk These solutions typically use [Cordova](https://cordova.apache.org/), [crosswalk](https://crosswalk-project.org/), or a custom WebView as a bridge to native APIs. * [Adobe PhoneGap](http://phonegap.com/) [$] -* [AppBuilder](http://www.telerik.com/appbuilder) [$] * [cocoon.io](https://cocoon.io) [free to $] * [ionic hub](http://ionic.io/) [free to $] * [kony](http://www.kony.com/products/mobility-platform) [$] * [Monaca](https://monaca.io/) [$] -* [Taco](http://taco.tools/) ##### Native Desktop WebView (i.e., Browser Engine Driven) App Frameworks: * [Electron](http://electron.atom.io/) * [NW.js](https://github.com/nwjs/nw.js) -##### Any Platform App Frameworks: - -These solutions take your application and build it across several platforms and devices - -* [manifoldJS](http://manifoldjs.com/) - ##### Native Mobile App Frameworks (Aka JavaScript Native Apps) These solutions use a JS engine at runtime to interpret JS and bridge that to native APIs. No browser engine or WebView is used. The UI is constructed from native UI components. @@ -52,9 +44,10 @@ These solutions use a JS engine at runtime to interpret JS and bridge that to na * [trigger.io](https://trigger.io/how-it-works/) [$] * [weex](https://weex.apache.org/) -##### References: +##### References & demo apps: * [todomvc.com](http://todomvc.com/) +* [RealWorld example apps](https://github.com/gothinkster/realworld) [code] * [Frontend Guidelines Questionnaire](https://github.com/bradfrost/frontend-guidelines-questionnaire) * [Frontend Guidelines](https://github.com/bendc/frontend-guidelines) @@ -65,40 +58,14 @@ These solutions use a JS engine at runtime to interpret JS and bridge that to na *** -###### NOTES: - -Keep an eye on [inferno](https://github.com/trueadm/inferno), [Svelte](https://svelte.technology/guide), and [NX](https://github.com/RisingStack/nx-framework) in 2017 for building component based UI applications. - -*** - ###### ADVICE: -[^1] If you are new to front-end/JavaScript application development I'd start with [Riot](http://riotjs.com/) or [Vue.js](http://vuejs.org/). Then I'd work my way to [React](http://facebook.github.io/react/). Then I'd look at [Angular 2](https://angular.io/), [Ember](http://emberjs.com/), or [Aurelia](http://aurelia.io/). +[^1] If you are new to front-end/JavaScript application development I'd start with [Vue.js](http://vuejs.org/). Then I'd work my way to [React](http://facebook.github.io/react/). Then I'd look at [Angular 2](https://angular.io/), [Ember](http://emberjs.com/), or [Aurelia](http://aurelia.io/). -If you are building a simple website that has minimal interactions with data (i.e. mostly a static content web site), you should avoid a front-end framework. A lot of work can be done with a task runner like [Gulp and jQuery](https://github.com/vigetlabs/gulp-starter), while avoiding the unnecessary complexity of learning and use an app framework tool. +If you are building a simple website that has minimal interactions with data (i.e. mostly a static content web site), you should avoid a front-end framework. A lot of work can be done with a task runner like [Gulp and jQuery](https://github.com/vigetlabs/blendid), while avoiding the unnecessary complexity of learning and using an app framework tool. Want something smaller than React, consider [Preact](https://preactjs.com/). Preact is an attempt to recreate the core value proposition of React (or similar libraries like Mithril) using as little code as possible, with first-class support for ES2015. Currently the library is around 3kb (minified & gzipped). -Can't decide between React or Angluar 2, read, ["Angular 2 vs React: The Ultimate Dance Off"](https://medium.com/javascript-scene/angular-2-vs-react-the-ultimate-dance-off-60e7dfbc379c#.j0r1xdvzl) - -*** - -###### SURVEY RESULTS: - -The images below are from the [2016 Frontend Tooling Survey](https://ashleynolan.co.uk/blog/frontend-tooling-survey-2016-results) (4715 developers) and [2016 State of JS Survey](http://stateofjs.com/) (9307 developers) - -![](../images/q13.jpg "https://ashleynolan.co.uk/blog/frontend-tooling-survey-2016-results") - -Image source: https://ashleynolan.co.uk/blog/frontend-tooling-survey-2016-results - -![](../images/frameworks1.png "http://stateofjs.com/") - -Image source: http://stateofjs.com/ - -![](../images/frameworks2.png "http://stateofjs.com/") - -Image source: http://stateofjs.com/ - diff --git a/tools/browser.md b/tools/browser.md index a7f3639..0c7ffcf 100644 --- a/tools/browser.md +++ b/tools/browser.md @@ -1,6 +1,6 @@ # Browser Tools -##### JS Browser Coding Utilities: +##### JS Utilities to fix Browsers: * [History.js](https://github.com/browserstate/history.js) * [html2canvas](https://github.com/niklasvh/html2canvas) @@ -32,7 +32,7 @@ * [Safari Web Inspector](https://developer.apple.com/safari/tools/) * [Vorlon.js](http://vorlonjs.com/) -##### Browser Coding Tools to Determine If X Browser Supports X: +##### JavaScript Utilities to Determine If X Browser Supports X: * [Feature.js](http://featurejs.com/) * [Modernizr](https://modernizr.com/) @@ -52,6 +52,7 @@ * [Browserling](https://www.browserling.com/) [free to $] * [BrowserStack](https://www.browserstack.com) [$] * [CrossBrowserTesting.com](http://crossbrowsertesting.com/) [$] +* [Ghost Inspector](https://ghostinspector.com) [free to $] * [Nightcloud.io](http://nightcloud.io/) * [Sauce Labs](https://saucelabs.com/) [$] @@ -75,6 +76,10 @@ Used for functional testing and monkey testing. * [browserhacks.com](http://browserhacks.com/) +##### Browser Syncing Tools: + +* [Browsersync](http://www.browsersync.io/) + ##### Browser List: Share target browsers between different front-end tools, like Autoprefixer, Stylelint and babel-preset-env. diff --git a/tools/cms.md b/tools/cms.md index 7cd81c3..87d926c 100644 --- a/tools/cms.md +++ b/tools/cms.md @@ -1,17 +1,18 @@ # Content Management Hosted/API Tools -##### API CMS (i.e., Content Delivery CMS) Tools: +##### Headless CMS Tools: * [Contentful](https://www.contentful.com/) [$] -* [Cosmic JS](https://cosmicjs.com/) [free to $] * [prismic.io](https://prismic.io/) [free to $] -* [elemeno](https://elemeno.io) [free to $] +* [Headless](https://www.headless.rest/) -##### Hosted CMS Tools: +##### Self-hosted Headless CMS Tools: + +* [Cockpit](https://getcockpit.com/) + +##### Hosted CMS: -* [Cushy CMS](https://www.cushycms.com) [free to $] * [LightCMS](https://www.lightcms.com) [$] -* [Page Lime](http://www.pagelime.com/) [$] * [Surreal CMS](http://www.surrealcms.com/) [$] ##### Static CMS Tools: diff --git a/tools/code-editor.md b/tools/code-editor.md index f77daef..2585435 100644 --- a/tools/code-editor.md +++ b/tools/code-editor.md @@ -38,14 +38,18 @@ Used to share limited amounts of immediately runnable code. Not a true code edit * [CodePen](http://codepen.io/) [free to $] * [jsbin.com](http://jsbin.com/) [free to $] * [jsfiddle.net](http://jsfiddle.net/) -* [liveweave.com](http://liveweave.com/) -* [Plunker](http://plnkr.co/) +* [StackBliz](https://stackblitz.com/) +* [codeSandbox](https://codesandbox.io/) *** ###### ADVICE: -[^1] I recommending using [Visual Studio Code](https://code.visualstudio.com/) because of the quality of the tool and the continuous improvements made to the editor that likely won't stop or slow due to the fact that Microsoft is behind the tool. +[^1] I recommending using [Visual Studio Code](https://code.visualstudio.com/) because of the quality of the tool and the continuous improvements made to the editor that likely won't stop or slow due to the fact that Microsoft is behind the tool. It is widely used: + +![](../images/vscode.png "https://stateofjs.com/2017/other-tools/p") + +Image source: https://stateofjs.com/2017/other-tools/p diff --git a/tools/comm.md b/tools/comm.md index f959557..bce0b63 100644 --- a/tools/comm.md +++ b/tools/comm.md @@ -3,7 +3,6 @@ * [Slack](https://slack.com/) & [screenhero](https://screenhero.com/) [free to $] * [appear.in](https://appear.in/) * [Mattermost](https://mattermost.org/) [free to $] -* [TeamViewer](https://www.teamviewer.com/) [free to $] ##### Code/GitHub Collaboration & Communication: diff --git a/tools/db.md b/tools/db.md index 1f9cb79..e0299ac 100644 --- a/tools/db.md +++ b/tools/db.md @@ -2,14 +2,13 @@ * [AlaSQL](http://alasql.org/) * [Dexie.js](http://www.dexie.org/) -* [ForerunnerDB](http://forerunnerdb.com/) * [LocalForage](https://localforage.github.io/localForage/) * [LokiJS](http://lokijs.org/#/) * [Lovefield](https://google.github.io/lovefield) * [lowdb](https://github.com/typicode/lowdb) * [Pouchdb](http://pouchdb.com/) * [NeDB](https://github.com/louischatriot/nedb) -* [YDN-DB](http://dev.yathit.com/ydn-db/index.html) +* [RxDB](https://pubkey.github.io/rxdb/install.html) diff --git a/tools/dev-tools.md b/tools/dev-tools.md index 7f0b127..360f6b3 100644 --- a/tools/dev-tools.md +++ b/tools/dev-tools.md @@ -1,8 +1,5 @@ -# General Front-End Development Tools +# GUI Development/Build Tools -##### Development Tools: - -* [Browsersync](http://www.browsersync.io/) * [CodeKit](http://incident57.com/codekit/) * [Prepros](https://prepros.io/) diff --git a/tools/diagram.md b/tools/diagram.md index c45bfd2..fc8a397 100644 --- a/tools/diagram.md +++ b/tools/diagram.md @@ -3,6 +3,7 @@ * [draw.io](https://www.draw.io/) [free to $] * [Cacoo](https://cacoo.com) [free to $] * [gliffy](https://www.gliffy.com/products/online/) [free to $] +* [sketchboard.io](https://sketchboard.io) [$] diff --git a/tools/hosting.md b/tools/hosting.md index ba345c9..f26d277 100644 --- a/tools/hosting.md +++ b/tools/hosting.md @@ -4,7 +4,7 @@ * [AWS](https://aws.amazon.com/websites/) [$] * [DigitalOcean](https://digitalocean.com) [$] -* [Heroku](https://heroku.com) [free to $] +* [WebFaction](https://www.webfaction.com/) [$] ##### Static @@ -14,6 +14,6 @@ * [Surge](https://surge.sh/) [free to $] * [Forge](https://getforge.com/) [$] -##### Local +##### Local Hosting Tools: [Localname](https://localname.io) \ No newline at end of file diff --git a/tools/html.md b/tools/html.md index c3e0286..080d1b5 100644 --- a/tools/html.md +++ b/tools/html.md @@ -7,7 +7,6 @@ * [HTML5 Boilerplate](https://html5boilerplate.com/) * [HTML5 Bones](http://html5bones.com/) * [Mobile boilerplate](https://html5boilerplate.com/mobile/) -* [Web Starter Kit Boilerplate & Tooling for Multi-Device Development](https://developers.google.com/web/tools/starter-kit) ##### HTML Polyfill: @@ -15,7 +14,6 @@ ##### Transpiling: -* [HAML](http://haml.info/) * [Pug](https://pugjs.org/api/getting-started.html) * [Markdown](http://daringfireball.net/projects/markdown/) @@ -25,7 +23,6 @@ * [Elements](https://html.spec.whatwg.org/multipage/indices.html#elements-3) * [HTML Arrows](http://htmlarrows.com/) * [HTML Entity Lookup](http://entity-lookup.leftlogic.com/) -* [HTML Interfaces Browser Support ](http://www.webbrowsercompatibility.com/html-interfaces/desktop/) * [htmlreference.io](http://htmlreference.io/) * [HEAD - A free guide to elements](https://gethead.info/) diff --git a/tools/offline.md b/tools/offline.md index 494f279..203ecd6 100644 --- a/tools/offline.md +++ b/tools/offline.md @@ -5,6 +5,12 @@ * [PouchDB](http://pouchdb.com/) * [upup](https://www.talater.com/upup/) +*** + +###### NOTES: + +For more tools look [here](https://github.com/pazguille/offline-first#tools). + diff --git a/tools/proto.md b/tools/proto.md index f07cd74..617165f 100644 --- a/tools/proto.md +++ b/tools/proto.md @@ -5,13 +5,16 @@ * [Axure](http://www.axure.com/) [$] * [Balsamiq Mockups](https://balsamiq.com) [$] * [Justinmind](http://www.justinmind.com/) [$] +* [Moqups](https://moqups.com/) [$] +* [proto.io](https://proto.io/) [$] * [UXPin](http://www.uxpin.com/) [free to $] + ##### Collaboration / Presenting: * [InVision](http://www.invisionapp.com/) [free to $] * [Conceptboard](https://conceptboard.com/) [free to $] -* [myBalsamiq](https://www.mybalsamiq.com/) [$] +* [myBalsamiq](https://balsamiq.cloud/) [$] diff --git a/tools/pwa.md b/tools/pwa.md index f1c9862..ea7cd1a 100644 --- a/tools/pwa.md +++ b/tools/pwa.md @@ -1,8 +1,6 @@ # Progressive Web App Tools: -##### Front-End App Frameworks: - -* [lighthouse](https://github.com/GoogleChrome/lighthouse) +* [lighthouse](https://developers.google.com/web/tools/lighthouse/) * [Progressive Web App Checklist](https://developers.google.com/web/progressive-web-apps/checklist) diff --git a/tools/static.md b/tools/static.md index 29f324a..14d3a3b 100644 --- a/tools/static.md +++ b/tools/static.md @@ -10,7 +10,7 @@ ###### ADVICE: -[^1] Before using a static site generator consider using [Gulp](http://gulpjs.com/) to orchestrate a custom solution or use a tool that makes use of Gulp for static site generation. e.g. [Gulp Starter](https://github.com/vigetlabs/gulp-starter) +[^1] Before using a static site generator framework consider using [Gulp](http://gulpjs.com/) or [npm scripts](https://scotch.io/tutorials/using-npm-as-a-build-tool) to orchestrate a custom solution or use a tool that makes use of Gulp for static site generation. e.g. [Blendid](https://github.com/vigetlabs/blendid) diff --git a/tools/templates.md b/tools/templates.md index 7f0b772..0aba69f 100644 --- a/tools/templates.md +++ b/tools/templates.md @@ -3,16 +3,17 @@ ##### Just Templating: * [doT.js](http://olado.github.io/doT/) -* [Handlebars](http://handlebarsjs.com/) - * [htmlbars](https://github.com/tildeio/htmlbars) +* [art-template](https://aui.github.io/art-template/) * [Nunjuncks](http://mozilla.github.io/nunjucks/) ##### Templating and Reactive Data Binding: -* [Deku](https://github.com/anthonyshort/deku) -* [jquerymy.js](http://jquerymy.com/) * [ractive.js](https://ractive.js.org/) * [react.js](https://facebook.github.io/react/index.html) + * [preact](https://preactjs.com/) + * [inferno](https://infernojs.org/) + * [nerv](https://github.com/NervJS/nerv) + * [rax](https://github.com/alibaba/rax) * [riot](http://riotjs.com/) * [Rivets.js](http://rivetsjs.com/) * [vue.js](http://vuejs.org/) diff --git a/tools/testing.md b/tools/testing.md index 8f28721..19accbf 100644 --- a/tools/testing.md +++ b/tools/testing.md @@ -3,10 +3,9 @@ ##### Software Testing Frameworks: * [Intern](https://theintern.github.io/) -* [Karma](http://karma-runner.github.io/1.0/index.html) * [Jest](http://facebook.github.io/jest/) * [majestic](https://majestic.debuggable.io/) - * [Enzyme]() + * [Enzyme](https://github.com/airbnb/enzyme) ##### Unit Testing: @@ -66,24 +65,6 @@ Testing frameworks typically offer more tools than just unit testing. If you are Nice [recap of testing JavaScript in 2017](https://medium.com/powtoon-engineering/a-complete-guide-to-testing-javascript-in-2017-a217b4cd5a2a). -*** - -###### SURVEY RESULTS: - -The images below are from the [2016 Frontend Tooling Survey](https://ashleynolan.co.uk/blog/frontend-tooling-survey-2016-results) (4715 developers) and [2016 State of JS Survey](http://stateofjs.com/) (9307 developers) - -![](../images/q18.jpg "https://ashleynolan.co.uk/blog/frontend-tooling-survey-2016-results") - -Image source: https://ashleynolan.co.uk/blog/frontend-tooling-survey-2016-results - -![](../images/test1.png "http://stateofjs.com/") - -Image source: http://stateofjs.com/ - -![](../images/test2.png "http://stateofjs.com/") - -Image source: http://stateofjs.com/ - diff --git a/tools/ui.md b/tools/ui.md index 7ee286b..28f55d3 100644 --- a/tools/ui.md +++ b/tools/ui.md @@ -2,38 +2,31 @@ ##### On Web Platform: [^1] -* [Bootstrap 3](http://getbootstrap.com/components/) or [Bootstrap 4](https://v4-alpha.getbootstrap.com/) * [Kendo UI](http://www.telerik.com/kendo-ui) for jQuery [free to $] * [Materialize](http://materializecss.com/) * [Office UI Fabric](http://dev.office.com/fabric) * [Semantic UI](http://semantic-ui.com/) -* [UiKit](https://getuikit.com/index.html) +* [UiKit](https://getuikit.com/) * [Webix](http://webix.com/) [$] -##### React Specific, On Web Platform: [^2] +##### React Specific, On Web Platform: * [Ant Design](https://ant.design/) * [Material ui](http://material-ui.com/) * [Semantic-UI-React](http://react.semantic-ui.com/introduction) +* [ExtReact](https://www.sencha.com/products/extreact/#app) [$] +* [Fabric](https://developer.microsoft.com/en-us/fabric) ##### Native Desktop/Laptop/Netbook Apps via Web Platform (i.e. used with NW.js and Electron): * [Photon](http://photonkit.com/) * [React UI Components for OS X El Capitan and Windows 10](http://gabrielbull.github.io/react-desktop/) -##### Mobile/Tablet Specific On Web Platform (i.e. used with touch focused UI's): - -* [Framework7](http://www.idangero.us/framework7) -* [Kendo UI Mobile](http://demos.telerik.com/kendo-ui/m/index) -* [Ratchet](http://goratchet.com/) - *** ###### ADVICE: -[^1] If you need a basic set of UI Widgets/Components start with [Semantic UI](http://semantic-ui.com/). If you are building something that needs a grid, spreadsheet, or pivot grid you'll have to look at [Kendo UI](http://www.telerik.com/kendo-ui) or [Webix](http://webix.com/). Also, keep in mind that most of these solutions still require jQuery. - -[^2] If I was going to build a React app and needed a toolkit of widgets/components off the shelf I'd with [Semantic-UI-React](https://react.semantic-ui.com/introduction) and/or [Ant Design](https://ant.design/), or I would accept that fact the some of the components I want to take off the shelf and use have a hard dependency on jQuery. +[^1] If you need a basic set of UI Widgets/Components start with [Semantic UI](http://semantic-ui.com/). If you are building something that needs a grid, spreadsheet, or pivot grid you'll have to look at [Kendo UI](http://www.telerik.com/kendo-ui) or [Webix](http://webix.com/). Keep in mind that most of these solutions still require jQuery.