{
    "componentChunkName": "component---src-templates-post-js",
    "path": "/how-to-choose-a-framework",
    "result": {"data":{"site":{"siteMetadata":{"title":"your friend Joel's digital garden","description":"Articles and notes from a collaborator at egghead.io. Musings on software, business, and life from a skilled virtual assistant.","author":{"name":"Joel Hooks"},"keywords":["Video Blogger"]}},"mdx":{"excerpt":"Have you ever experienced the crippling fear of choosing a frontend framework to go deep on, to use for your next project, or to specialize in? We've got sparse time to spend learning, and how we choose to specialize is a critical aspect of…","fields":{"github":"https://github.com/joelhooks/joelhooks-com/tree/master/content/blog/2019-11-17--how-to-choose-a-framework~~sOsDeLZ7Z/index.mdx"},"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"id\": \"sOsDeLZ7Z\",\n  \"slug\": \"how-to-choose-a-framework\",\n  \"date\": \"2019-11-19T00:00:00.000Z\",\n  \"title\": \"How do You Choose a Front-End Framework?\",\n  \"published\": false\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Have you ever experienced the crippling fear of choosing a frontend framework to go deep on, to use for your next project, or to specialize in?\"), mdx(\"p\", null, \"We've got sparse time to spend learning, and how we choose to specialize is a critical aspect of being a web developer. It's a choice that makes a difference. \"), mdx(\"p\", null, \"It's a decision that matters.\"), mdx(\"p\", null, \"For me, and many others, the choice is very mainstream.\"), mdx(\"p\", null, \"Pragmatic.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"What are other people learning and using?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Who will be working on the project?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Where are the jobs?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Is this something we can hire for?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"How's the community?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Are the docs excellent?\")), mdx(\"p\", null, \"For others still the choice might be more granular and specific for a particular problem.\"), mdx(\"p\", null, \"One of the most critical factors is \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"who will be working on a project\"), \". \"), mdx(\"p\", null, \"If it is just myself, I might go for something experimental for learning or evaluating new less proven technology and patterns.\"), mdx(\"p\", null, \"If it is myself and one or two other people, we can all chat and decide what we want to use for a given project.\"), mdx(\"p\", null, \"At egghead we've gone through a lot of experimentation with various ways to utilize CSS. The experiments are on smaller free standing projects so we can explore the current options for CSS-in-JS and figure out what works best for all of us and our users.\"), mdx(\"p\", null, \"If you are choosing technology for larger teams, more questions arise.\"), mdx(\"p\", null, \"More care must be taken in the evaluation of new tools and patterns.\"), mdx(\"p\", null, \"This is why \\\"enterprise\\\" software lags behind the bleeding edge by many years. It's why you can find COBOL actively used or any number of \\\"legacy\\\" languages, frameworks, infrastructure, and practices.\"), mdx(\"p\", null, \"But those slower changes are a result of our individual experimentation and exploring tools at the bleeding edge.\"), mdx(\"p\", null, \"This includes the inventors that are dissatisfied with the status quo and are out there thinking about the framework that doesn't exist yet. Something new. Something better.\"), mdx(\"p\", null, \"There's never \\\"best\\\" practices. We only have what works right now \\uD83D\\uDE02\"), mdx(\"p\", null, \"Speaking of best practice I really enjoyed \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.youtube.com/watch?v=3XaXKiXtNjw\"\n  }, \"this short 15 minute video from Michael Jackson\"), \" that digs into what really good composition can look like for building components and how we can use that in React to avoid using Context willy nilly and not be stuck with \\\"pass the puck\\\" style prop drilling in our apps. It's generally interesting and I think the rules and ideas of composition are broadly applicable and not just related to React.\"));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"How do You Choose a Front-End Framework?","date":"November 19, 2019","banner":null,"slug":"how-to-choose-a-framework","keywords":null}}},"pageContext":{"id":"052c4d36-17d0-5147-92f5-daa90d0a32f5","prev":{"id":"d7ca8d77-7e00-5fb5-8c39-6589288f1198","parent":{"name":"index","sourceInstanceName":"blog"},"excerpt":"Building an email list is both art and science. The tactics aren't obvious. The skills are built over time with slow trial and error. It's really a pain in the ass sometimes. Over the years while building egghead's list to over 150,000 subscribers…","fields":{"title":"Mastering ConverKit by Brennan Dunn","slug":"mastering-converkit","date":"2019-11-20T00:00:00.000Z"}},"next":{"id":"4a83ba90-59f9-524f-9d85-91cea0c44a50","parent":{"name":"index","sourceInstanceName":"blog"},"excerpt":"We've got a robust Rails app that does a lot of heavy lifting for us. We've crafted a full hateos REST api with a delightful GraphQL layer over the top. We started using React as our primary UI a few years ago, and we do SSR via React on Rails. It's…","fields":{"title":"🤠 Gatsby on Rails","slug":"gatsby-on-rails","date":"2019-11-17T00:00:00.000Z"}}}},
    "staticQueryHashes": ["1045846374"]}