News for hackers. Stuff that matters.
Re:A Primer for Building Single Page Applications with React by unklefolk on Tuesday March 24, 2015 @06:46AM (#9255780)
Honest question here from someone new to React. Isn't the way it mixes in HTML, CSS classes and JS altogether something we were trying to get away from a few years ago? It feels a bit like old school ASP! I'm not trying to be flippant, I just was always taught about separation and mixing HTML markup with JS logic seems like we are going the other way.
Re:A Primer for Building Single Page Applications with React by skrebbel on Tuesday March 24, 2015 @07:15AM (#9255867)
> Isn't the way it mixes in HTML, CSS classes and JS altogether something we were trying to get away from a few years ago?

That's a best practice for web sites. If you're making a website (where every page has roughly the same look and structure, but just different content), then it's probably a good best practice to have.

It all went haywire, however, when using the web for applications. While well-designed applications also have commonalities to them (button styles, margins, etc), the various screens and dialogs in an application vary way more in structure than the various pages on a typical informational web site tend to do.

It turns out that separating logic and presentation in web applications the way you would on web sites is a very bad match. You simply end up putting logic that is very closely tied together in three different places. E.g. typical jQuery code that falls apart the moment you change either the HTML (turn a div into a span, whatever), or the css class names, or the jquery selector/handler code, all of which is located in different files deep in a different directory hierarchy. For each single widget in your app (button, dropdown, LoginScreen, etc), it's much better to put all that code together.

And that's what React lets you do.

(note that this means that you really do want to tie your styles closely to your react components too - either inside the JS or with e.g. one .sass file for each React component)

Re:A Primer for Building Single Page Applications with React by BinaryIdiot on Tuesday March 24, 2015 @10:29AM (#9256783)
> It turns out that separating logic and presentation in web applications the way you would on web sites is a very bad match. You simply end up putting logic that is very closely tied together in three different places.

As a web developer for the past 10 years I can't disagree with this more. It wasn't the easiest thing to accomplish maybe 5 years ago but it was always doable and now with web components it's incredibly easy.

React is cool but I wouldn't call separating logic and presentation bad. I would call that a best practice.

Re:A Primer for Building Single Page Applications with React by Silhouette on Tuesday March 24, 2015 @04:56PM (#9259426)
I wouldn't call separating logic and presentation bad. I would call that a best practice.

Even if that is true, it is not clear that trying to separate HTML, CSS and JS necessarily achieves a useful degree of separation between logic and presentation.

In "traditional" application development, we have long recognised that things like keeping the underlying data isolated from any particular presentation or interaction style can have advantages. However, you wouldn't find a lot of people arguing for creating a dialog box in some visual design tool in your IDE, writing separate code in a programming language to populate its controls and respond to interactions with them, and then somehow trying to join the dialog and the code up while keeping everything at arm's length.

Modular design has always been about keeping related aspects of a program together and minimising other dependencies. This means you can do useful things like changing one part of a program without running into surprising or uncontrolled side effects elsewhere. But if you have different aspects of the application that inherently do change together, as is often the case with HTML/CSS/JS in a web app, there is little benefit to trying to separate them for dogmatic reasons.

Re:A Primer for Building Single Page Applications with React by BinaryIdiot on Tuesday March 24, 2015 @07:24PM (#9260269)
> Even if that is true, it is not clear that trying to separate HTML, CSS and JS necessarily achieves a useful degree of separation between logic and presentation.

I agree and this is why I continued to iterate OP's word usage of separating logic and presentation. Separation of HTML, CSS and JavaScript isn't always useful or straight forward but separating business logic from the user interface is incredibly important, in my opinion.

Separation of HTML, CSS and JavaScript is more of an organizational thing in my mind. JSX makes the syntax awkward and more complex in my opinion especially when you're working with a group of designers who are constantly tweaking styles, element layouts, etc. But for a team of only developers it's not so bad. Still I personally find it easier to simply avoid JSX either way.

Re:A Primer for Building Single Page Applications with React by Silhouette on Tuesday March 24, 2015 @07:37PM (#9260332)
Separation of HTML, CSS and JavaScript isn't always useful or straight forward but separating business logic from the user interface is incredibly important, in my opinion.

I agree, but if we're talking about using a front-end framework like React here, wouldn't that mean we're only talking about the UI parts of the application anyway?

Personally I'm not a big fan of either big frameworks generally or some details of React in particular, but the people behind React do make reasonable arguments in favour of their more component-based separation of concerns.

Re:A Primer for Building Single Page Applications with React by BinaryIdiot on Tuesday March 24, 2015 @10:07PM (#9260875)
> I agree, but if we're talking about using a front-end framework like React here, wouldn't that mean we're only talking about the UI parts of the application anyway?

I don't think so; when working on code for a web application there is always code, styling and html elements that deal ONLY with the presentation side of it but then there is also code that handles talking to the backend, negotiating with web sockets, etc. That code really needs to be separated and what I'm referring to.

> the people behind React do make reasonable arguments in favour of their more component-based separation of concerns.

I love component based separations and I get the feeling many of us are talking about similar things.

Re:A Primer for Building Single Page Applications with React by Silhouette on Tuesday March 24, 2015 @11:16PM (#9261072)
I don't think so; when working on code for a web application there is always code, styling and html elements that deal ONLY with the presentation side of it but then there is also code that handles talking to the backend, negotiating with web sockets, etc. That code really needs to be separated and what I'm referring to.

Right, but React isn't normally used for things like back-end comms. It's often loosely described as being for the "V" in "MVC", which makes sense given the whole declarative specification of DOM content angle and the one-way data binding style.

Re:A Primer for Building Single Page Applications with React by Bahamut on Tuesday March 24, 2015 @11:37AM (#9257250)
Web Components does what React essentially does, bring them together.
Re:A Primer for Building Single Page Applications with React by BinaryIdiot on Tuesday March 24, 2015 @12:34PM (#9257659)
As with all technologies it matters how they are used; I simply stated web components make the separation easier than ever before but that doesn't mean the same can't be done with JSX.

I think it's very important to keep the interface away from the logic. Creating components in React that only drive the user interface isn't bad but it's not as straightforward as something native like dealing directly html and css. I've worked with many designers who are awesome at styling and making pages look great but when they have to edit any type of scripting or something outside of HTML / CSS it's a whole new skill-set they need to learn to be effective (a skill-set they don't really need that the majority do not have).

Re:A Primer for Building Single Page Applications with React by Bahamut on Tuesday March 24, 2015 @02:31PM (#9258471)
Some components turn out to need logic though - consider some of the Twitter Bootstrap components that rely on JavaScript. They would not work without the JS.

I do agree that there are concerns when it comes to having people edit certain aspects if they specialize, I have seen similar things in the past. I would say that this depends on the people you work with.

Re:A Primer for Building Single Page Applications with React by BinaryIdiot on Tuesday March 24, 2015 @07:21PM (#9260256)
> Some components turn out to need logic though

Depends on what we're referring to when we talk about logic. I consider the user anything the user directly interacts with while with the logic I was mostly referring to business logic. It's fine to have interactive pieces that need JavaScript as long as they're kept away from the business logic.

My rule of thumb is: the user interface and the business logic should be separated to the point where you can completely replace the business logic without touching the user interface and vice versa. That's the separations I strive for and it's incredibly helpful when a designer wants to completely rearrange everything about the user interface because only one area needs changing.

Re:A Primer for Building Single Page Applications with React by ARussell on Wednesday March 25, 2015 @02:32AM (#9261572)
I agree with this. I also think it that keeping logic out of views is a good idea, but I think that like many one-liners, there is more to it than just that.

I think that there is a certain amount of logic that is necessary in our views. Otherwise, JavaScript would not exist. Manipulating the DOM via the vanilla API or via jQuery is only hiding that logic in another file. The logic is still there, and calling it "separate" is not useful, in my opinion.

I like the way React bundles this view-specific logic and the markup together. Now I don't have to look at some HTML and wonder if some JavaScript somewhere is messing with it.

CSS is another matter entirely. CSS doesn't change behavior and is another concern entirely, so I do still prefer it to live in its own files rather than being inline. React doesn't change anything about this, and that is fine by me.

Re:A Primer for Building Single Page Applications with React by NoGravitas on Tuesday March 24, 2015 @08:09AM (#9256068)
Is the distinction between web sites and web apps really valid, though? No matter how dynamic your site is, you still have certain responsibilities to your users, including giving them the best user experience you can, but also things like accessibility, sane SEO, bookmarkable resources, and, in the long run, maintainability. Is a highly dynamic site really a "get out of jail free card" for best practices?
Re:A Primer for Building Single Page Applications with React by skrebbel on Tuesday March 24, 2015 @08:19AM (#9256095)
> Is a highly dynamic site really a "get out of jail free card" for best practices?

No, of course not. React proposes to replace one "best practice" by a different one. In React, the best practice is to divide your application up in a deep hierarchy of components, each of which adds one single little layer of abstraction over the other. Then, put all the logic and presentation that's relevant for that little piece of abstraction together inside that little component.

This way, you have very good separation of concerns - all "Button" stuff is together in the Button component, all AreYouSureDialog stuff is together in the AreYouSureDialog component (which in turn uses Button components), and so on. Because components can only interact with each other via props and refs, you also have very fine-grained control over the interface: it's difficult for the programmer of a parent component to influence the behavior of the child component any further than by the interfaces that the child component explicitly exposes for that (= props, and public methods for use via refs).

How is all that a "get out of jail free card"?

I've found that this design principle works very well with teams, even with junior team members. I've seen people who had never gotten further than building 10000-line CSS files with all kinds of horrible hacks let loose in a React project. After we explained the component principle and made an example component to easily copy&paste, they independently and without further encouragement started making React components for each little possibly-reusable part of the application. Buttons, frames, dialogs, cards, lists, you name it. React really makes it easy to make well-structured code and difficult to make things a mess.

I don't see how and of this impacts any of the responsibilities you mention (good UX, accessibility, etc) so I can't respond to that part of your comment.

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @09:41AM (#9256448)
it's difficult for the programmer of a parent component to influence the behavior of the child component

You seem to focus only on the few drawbacks of CSS inheritance and to ignore its biggest advantages like you don't have to write declaration for every and each element on the page and rely instead on inheritance for props to cascade properly.

Yeah sometimes undesired consequences occur on elements but it's easy to remedy the situation if you know what are you doing but by moving all the presentation info to your logic layer in development, and then littering the structure/content layer i.e. HTML via style attribute in run time, this is unacceptables and can't be seen as progress for the industry in any way.

Re:A Primer for Building Single Page Applications with React by rpedela on Tuesday March 24, 2015 @10:35AM (#9256818)
> You seem to focus only on the few drawbacks of CSS inheritance and to ignore its biggest advantages like you don't have to write declaration for every and each element on the page and rely instead on inheritance for props to cascade properly.

This presentation explains what problems React inline CSS solves. https://speakerdeck.com/vjeux/react-css-in-js

EDIT: I gave wrong presentation link initially.

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @10:40AM (#9256853)
This presentation explains what problems React inline CSS solves

Could you please summarize in a few sentences what are these probs this approach deem to solve?

Because I have seen demos and talks from React people and I was appalled at their neglect of best practices and bending the rules just to push their product and technologies on the community

Re:A Primer for Building Single Page Applications with React by origin-unknown on Tuesday March 24, 2015 @02:53PM (#9258616)
My main complaint with CSS in JS is that a strict naming convention solves a lot of the problems without coupling styles in application bundles. Basically, I don't want to invalidate my JS bundle just to include a new visual theme.

Luckily, you can use CSS best practices with React.

The problems mentioned in the presentation, followed by some CSS-friendly solutions --

1) Global namespace: all selectors are global

Use a naming convention.

2) Dependencies: no way to specify that a block of markup depends on a particular CSS module

Use a build process and a naming convention that includes a component name.

3) Dead code elimination: difficult to determine when styles are no longer needed

Loop over components and extract CSS component names from class attributes.

4) Minification: can't minify class names in markup

Not a bottleneck, nobody cares.

5) Sharing constants: can't share constants/variables with javascript

Use rework/postcss.

6) Non-deterministic resolution: loading styles asynchronously can result in different results since specificity assumes later rules should override earlier rules and async load order is arbitrary

Use SUIT CSS to prevent collisions and normalize specificity.

7) Isolation: base component CSS can be trashed by authors of subcomponents, making it difficult to change base CSS.

Reduce responsibilities of base component CSS. Encourage use of modifier classes. Ban tag selectors from component CSS. Use a SUIT CSS compliance checker.

I use SUIT CSS with React and couldn't be happier.

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @05:09PM (#9259517)
Seriously, all these points sound very fancy and I suspect that they bring unequivocal productivity gain to the dev environment but my main beef with FB or any other org is that they push this workflow or other methodologies as universal best practices or even distort reality and claim that mixing content/presentation/logic is the only right way to "separation of concerns" and all what you knew before about this topic is a hoax and big lie.
Re:A Primer for Building Single Page Applications with React by mejari on Tuesday March 24, 2015 @01:26PM (#9258016)
Why are you looking at this as "bending the rules" instead of as creating new rules for a new way of building web applications? Just hand-waving "best practices" doesn't actually mean that something is best practices if someone else comes up with a better practice.
Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @01:57PM (#9258259)
You guys have to convince us first that mixing content+structure/presentation/logic is the best way to go forward in web development for the following reasons 1,2,3 ..etc.

I'm all for progress and challenging/questioning previous norms or traditions. I hate dogma and dogmatic people like the next guy but I need first to see improvement in the new thing before going adopting it.

What I see now frankly is the opposite of progress. I see people advocating for dispensing of "separation pf concerns" & "progressive enhancement" in the name of "progress" and "modernization" but in reality it's just a lame excuse to regress to a state of affairs that we guys fought too hard to combat it and bring awareness to the community of its pitfalls and shortcomings.

Re:A Primer for Building Single Page Applications with React by mejari on Tuesday March 24, 2015 @02:07PM (#9258324)
>You guys have to convince us first that mixing content+structure/presentation/logic is the best way to go forward in web development for the following reasons 1,2,3 ..etc.

There are a million articles and talks that provide exactly this. If you don't find them convincing that's fine, but don't act like no one is providing them.

> I see people advocating for dispensing of "separation pf concerns" & "progressive enhancement" in the name of "progress" and "modernization"

If that's what you see then you're looking in some weird places. The drivers behind React aren't just vague ideas like "modernization", they're the real-world benefits people are seeing when developing and using these new ideas. You're doing a disservice to everyone by fabricating the reasons behind these ideas just because you don't like them.

>in reality it's just a lame excuse to regress to a state of affairs that we guys fought too hard to combat it

This really just seems like a stodgy "get off my lawn, kids!" approach, which is at odds with your "I hate dogma" statements. Do you honestly believe that people are pushing in this direction solely as an excuse to regress things and make it worse? Even if you think that it is "regressing" things, you can't possibly be so conservative and entrenched as to actually believe that is people's goal, can you?

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @05:30PM (#9259633)
There are a million articles and talks that provide exactly this. If you don't find them convincing that's fine, but don't act like no one is providing them.

If you have been asked what's the most important convincing reason to switch to React, what would be your answer?

Please no mention of web apps vs web docs. We're already established that.

- It has been all about progress and modernization all the time. Progress in terms of productivity gains and speed was the motivation behind dropping jQuery centered architecture and going for an MVC framework instead and it's what's motivating the spawning of these frameworks as well. I don't know why this point is contentious one for you.

Do you honestly believe that people are pushing in this direction solely as an excuse to regress things and make it worse?

I didn't say that and I don't believe that they're intentionally pushing in this way to harm the industry and the community but I do believe that , while in the midst of chasing the latest trendy object, they won't realize that they're giving up very valuable stuff that benefited the industry for a long time.

Re:A Primer for Building Single Page Applications with React by cc81 on Tuesday March 24, 2015 @05:05PM (#9259489)
You are already doing that in a normal template. Let us say you are building a shopping cart.

The template will contain logic like an iteration over what has currently been put in the basket. And maybe some condition that if the basket is empty you should show a friendly string instead. Then you have some additional logic in a js file that will collapse the list of items if the user does not want to see everything. This is usually done by using a id/class or html element to grab on to.

The idea behind React is that you put all possible states and ways the view can render in a component. You still would (generally) not have actual logic in it; like grabbing data from the server or calculating stuff.

It is different yes but I think it is a neat idea. We will have to see if it is a viable path forward but I think this "rethinking best practices" is really good and has already influenced the rest of the frameworks quite a lot.

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @05:51PM (#9259750)
The main difference is that the logic in template files is the guest here while the markup is the host. We're used to include presentation info in <style> tags and code in <script> tags. So, it is not really a great deal of change to include template language within our content even though I still prefer logic-less or minimal logic template languages over full blown ones to avoid turning web pages into a whole mess.

But the problem with React is they are not being honest with marketing their technology. They claim that their approach to blending everything together as "separation of concerns " and some of their evangelists had even the nerve to claim that their approach is the only true way to best practices and that we have been doing it wrong all this time. So, it turned from product evangelism to pure propaganda for them.

If they were forthcoming about it from the get go "Hey guys, we know that violates SoC but you guys we'll make up in terms of productivity gains and speed what you will give up in maintenance and readability" but instead they keep pushing their propaganda and people seem to eat it up.

Re:A Primer for Building Single Page Applications with React by cc81 on Tuesday March 24, 2015 @06:26PM (#9259943)
It is still mixing presentation with logic if you use a template file. So why do you think it is alright to violate SoC in that case?

They have been very detailed with what you get with React and their first presentation was even called "Rethinking best practices".

It does not violate separation of concerns. For me it is the opposite and you actually have real separation of concerns instead of separation of technologies. And even if my project is pretty young it feels like it will be easier to maintain.

How often don't you have DOM manipulation (hiding or showing a div) in the same Javascript file as some actual logic. How is that separated concerns?

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @06:58PM (#9260129)
It is still mixing presentation with logic if you use a template file. So why do you think it is alright to violate SoC in that case?

I am not puritan or dogmatic. That's what I have been trying to convey here. I'm pragmatic to the core but I am no propagandist.

If I was asked if template languages violate SoC, I would not hesitate to reply "SURE" but I'm keeping to a minimum and I'm using logic-less flavors instead.

But reinterpreting SoC as SoT and trying to evade admitting that you guys at fault is not really something to commend you on. Too much revisionism and propaganda for my taste.

Re:A Primer for Building Single Page Applications with React by jbergens on Wednesday March 25, 2015 @02:52AM (#9261606)
I think you're reading too much into it. I see it as a new way of working with new tools that Facebook has found to be better for them. We can try the new tools and see if it works better for us.
Re:A Primer for Building Single Page Applications with React by woah on Tuesday March 24, 2015 @11:47AM (#9257329)
I'm curious, which demos and talks are you referring to?
Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @12:01PM (#9257434)
One of those done at the latest ReactJS Conf where they introduced React Native. Check their channel on YT for the info.
Re:A Primer for Building Single Page Applications with React by dagw on Tuesday March 24, 2015 @08:23AM (#9256112)
Accessibility, SEO and bookmarkable resources aren't always a requirement. The GMail app (as opposed to the login page) for example doesn't need SEO. If you're targeting a known specific audience then you don't necessarily have to focus on accessibility. Bookmarkable resourecs doesn't always make sense either, for example if you're making a web based image editor (although I suppose you could create bookmarks into each images editing history or something if you're doing non-destructive editing) . Maintainability is of course important, but I've yet to see a convincing argument that one approach gives a priori better maintainability.
Re:A Primer for Building Single Page Applications with React by bphogan on Tuesday March 24, 2015 @03:31PM (#9258871)
As a low vision computer user that supports disabled people on the web, and whose father spent 30 years working with disabled people, I can tell you for a fact that for some people, accessibility should be a requirement all the time.

Especially as more things go toward the web.

The disabled is a club anyone here can join, at any time.

Re:A Primer for Building Single Page Applications with React by bronson on Tuesday March 24, 2015 @09:30PM (#9260745)
Using the GP's example, it would take a huge amount of effort to make an online image editor accessible to the blind. I'm not sure that would be time well spent.

All the GP is saying is that the trade-offs will depend on your audience.

Re:A Primer for Building Single Page Applications with React by oe on Tuesday March 24, 2015 @09:49AM (#9256499)
Building and application doesn't automatically mean discarding accessibility, SEO or sane URLs. Modern JS-frameworks like React handle them quite easily.
Re:A Primer for Building Single Page Applications with React by rimantas on Tuesday March 24, 2015 @04:19PM (#9259179)
Yes, it is valid. To quote Tantek:

  >  if it’s not curlable, it’s not on the web.
http://tantek.com/2015/069/t1/js-dr-javascript-required-dead
Re:A Primer for Building Single Page Applications with React by philbo on Tuesday March 24, 2015 @08:25AM (#9256119)
The reason I usually prefer to separate script and markup is that it makes the logic easier to test and those tests less brittle when the markup changes. Not having had any experience with react, I was wondering what the accepted approach to testing is?
Re:A Primer for Building Single Page Applications with React by skrebbel on Tuesday March 24, 2015 @08:27AM (#9256129)
React can run without a real DOM attached.

One common way is to have React render into a simulated DOM (e.g. https://github.com/tmpvar/jsdom) and then trigger event handlers with code. You make assertions over the structure of the rendered DOM to know whether things went fine, all without a browser attached.

A dumber way that works remarkably OK too for simpler scenarios is to just have React render stuff to HTML strings and do regexes over those strings. Hacky, and if you're doing serious app development you probably don't want this, but it's a very easy way to get started.

Re:A Primer for Building Single Page Applications with React by pjtops on Tuesday March 24, 2015 @08:06AM (#9256058)
What about desktop/mobile applications - is it ok to mix your logic and presentation there?
Re:A Primer for Building Single Page Applications with React by emehrkay on Tuesday March 24, 2015 @09:23AM (#9256350)
This is a great question. The little iOS development that I've done it seems like the script and style are tied together with the markup.

I think about how painful it would be adding a custom button(new behavior) to a notification on a website: you either add an event listener to the dom and listen for it to bubble or add it to the button directly(the easier option). These new web frameworks seem to be adding it directly to the dom node -- we're back to <a onClick="function('value')"> which is faster, but traditionally harder to manage. But since everything is a structured component (all of these things implement an interface) we can build them faster and worry about it on the component level and not the markup level.

I've been playing with React and Riot and it is a very interesting approach. You can build things out a lot faster than you used to and that is what matters in the end. The user will not care if you separate concerns (as long as the page renders and is accessible, but that is another story).

Re:A Primer for Building Single Page Applications with React by JustSomeNobody on Tuesday March 24, 2015 @11:42AM (#9257284)
Not familiar with react and barely JavaScript, but why is <a onClick="function('value')"> bad? I mean as longs as the function calls a function on another module and doesn't contain any more logic than that. The other module remains testable, and the only logic in the UI is a function call. If the interface of the module changes, sure the UI would have to change, but I tend to think people over think things at this point (my opinion and I hope it doesn't distract from my original question).
Re:A Primer for Building Single Page Applications with React by mtrimpe on Tuesday March 24, 2015 @03:01PM (#9258658)
As far as I'm concerned <a onClick="function('value')"> was bad because 'function' was a global variable reference.

I don't think that's the case for React though so I'm not sure if the GP saw some other drawbacks in it (apart from the aesthetic of separating logic from presentation.)

Re:A Primer for Building Single Page Applications with React by Bahamut on Tuesday March 24, 2015 @04:48PM (#9259381)
In React, you would do <a onClick={this.props.foo('value')}> (for example) - JSX would interpolate that and set up the appropriate click binding, and the function is local to the component.
Re:A Primer for Building Single Page Applications with React by woah on Tuesday March 24, 2015 @11:52AM (#9257376)
My experience with iOS development is that you just have to hack things together in whatever way works. Frequently you'll get a screen 70% of the way there with slick but inflexible visual editor, then need to copy and paste a bunch of imperative methods to modify things further at runtime. All of this separation of concerns stuff is a bit lofty for iOS.
Re:A Primer for Building Single Page Applications with React by kyllo on Tuesday March 24, 2015 @08:51AM (#9256223)
Just because your HTML, JS and CSS are in different files doesn't change the fact that they are tightly coupled. React dispenses with this superficial separation and groups presentation, behavior and styling of the same UI element together. I've found it much easier to reason about.
Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @11:08AM (#9257031)
But if these individual components share any code between them, you'd still have to write the same lines over and over again for each component.

So, how do you reason about that?

Re:A Primer for Building Single Page Applications with React by lobster_johnson on Tuesday March 24, 2015 @11:17AM (#9257110)
There is no reason that components can't share code. It's just JavaScript. Extract common code into libraries, mixins or even components.

For example, we frequently create generic containers that modify the behavior of the child or parent. One example is a container that automatically sets its children to be "sticky" once you scroll past it. Another common parent is one that renders it's children is a modal (lightbox, dialog or similar). Another is a child component that, if you nest it into another, can notify the parent whenever its dimensions change.

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @12:52PM (#9257769)
So you guys are basically defining a new inheritance model in your app, right?
Re:A Primer for Building Single Page Applications with React by lobster_johnson on Tuesday March 24, 2015 @01:02PM (#9257832)
It's not inheritance at all. The code sharing is across interface boundaries, not like inheritance where, say, changing a member variable can break descendant classes. Instantiating a component is just like declaring a variable.
Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @01:17PM (#9257944)
So, you're getting rid of inheritance altogether and settling for this interface boundary sharing notion?
Re:A Primer for Building Single Page Applications with React by yazaddaruvala on Tuesday March 24, 2015 @03:32PM (#9258876)
> getting rid of inheritance altogether and settling for this interface boundary sharing

You claim it is "settling" but I'll try to explain why its not only not "settling" but actually encouraging best practices. I'm not sure what language you're most familiar with but since you're talking about inheritance I'll try to provide Java analogies.

Hierarchal components => Hierarchical composition of classes

Mixins => Interfaces with default implementations (possible as of Java 8)

Inheritance, as defined by the OO paradigm, is very rarely the correct solution. Even in a language like Java, when it comes to classes, the best practice is to use composition over inheritance. If you haven't heard this before, or you don't agree, sorry but I'd rather not get into this myself. There are a ton of really good resources online about this, they will do a far better job explaining than I would.

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @05:00PM (#9259451)
I aint no traditionalist or a Java supremacist :). I'm just an ordinary guy with passion for anything web development and I happen to like javascript a lot.

So, I'm okay with non classical inheritance or any other non conventional constructs that would make our lives easier but I'm really skeptical about the direction that these frameworks is taking the industry as a whole in, and I believe that their lack of enthusiasm for established best practices and breaking the rules without offering well thought and coherent alternatives is worrisome.

Re:A Primer for Building Single Page Applications with React by lobster_johnson on Tuesday March 24, 2015 @08:36PM (#9260570)
React isn't about breaking rules or disregarding best practices. It's simply recognizing that other principles need to be applied for a certain type of application.

Those principles are in fact old, and originate in the desktop app. Every single desktop UI framework throughout history, from Xerox Star to Visual Basic to Swing to Delphi to Cocoa, has modeled the UI in terms of components (sometimes called controls or widgets) that can be contained within each other. Components are logically independent containers whose behaviour and rendering follow them around; drop a button onto a form, for example, and you get "button behaviour" without having to implement anything yourself. React follows this exact pattern.

The reason people are interested in "breaking" rules such as separation of style and markup is because those principles don't apply well to this way of doing things. Components aren't document markup to be styled, they're views that need to draw themselves. You can devise various ways to continue using CSS to "skin" these components, but this is ultimately the enemy of a good component. It turns out that for components to be true containers, they have to have complete control over their own rendering, and inserting global CSS that cascades into a component tends to violate that boundary. In other words, the component _is_ presentation, and therefore a "separation" makes no sense because there isn't much to separate.

You can debate the merit of modern single-page apps, but people are building them, and need the tools to do so. At the same time it's clear that people (not just developers) want both the power of the web, and the power of desktop apps, and developers are now trying to discover how this hybridization — the appification of the web browser and the webification of the desktop — can be attained. React is probably just one step in the search for some better converging structure.

You criticize React a lot in this thread, but I can assure that it's well thought and coherent. I've been a web developer for about 20 years, and this is the most productive and content I have been about working in a browser. I recommend trying it out.

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @08:55PM (#9260628)
One of the best rebuttals I have read on this thread. I'm no React hater and I honestly consider trying it out just to see what's all the buzz about but it won't still fit my definition of proper SoC.
Re:A Primer for Building Single Page Applications with React by lobster_johnson on Tuesday March 24, 2015 @10:29PM (#9260930)
I think you'd be surprised if you actually gave it a go. I'm something of a separation-of-concerns fussbucket myself.
Re:A Primer for Building Single Page Applications with React by lobster_johnson on Tuesday March 24, 2015 @01:27PM (#9258022)
Yes, we generally only use mixins. Classical OO inheritance causes coupling problems that composition doesn't.
Re:A Primer for Building Single Page Applications with React by dagw on Tuesday March 24, 2015 @06:53AM (#9255800)
'We' never really came to an agreement on that question. Some people always thought it was a pretty good idea to keep things that belong together close together and some people didn't. The separation people have been dominant for a couple of years, but a bunch of people didn't really like that approach and are now taking a new stab at finding a new solution the problem.

It's just two different schools of thought and really comes down to personal preference. Fashion ebbs and flows and what was old is new, and what was new is old.

Re:A Primer for Building Single Page Applications with React by lobster_johnson on Tuesday March 24, 2015 @11:10AM (#9257055)
In addition to what skrebbel said, let me clarify that React doesn't encourage you to mix _all_ logic with presentation, only that logic which relates to presentation; everything else ("business logic") belongs elsewhere.

The core idea is that presentation logic belongs with the presentation; you cannot separate the two. In classical MVC frameworks such as Cocoa, this is accomplished with a controller that is tightly coupled with its view. Most people use Interface Builder and maintain the view in a separate file, but this is purely a pragmatic design allowing IB to use a different file format from your code. You could write the entire UI in Objective-C/Swift code, right in the controller, and in terms of layering there would not be a lick of difference.

React, like other MVC-bases systems, encourage the UI logic to be slim and strictly UI-oriented, and to move the application logic -- that which deals with the flow of data/state -- to a separate layer.

Re:A Primer for Building Single Page Applications with React by Retozi on Tuesday March 24, 2015 @10:13AM (#9256649)
In my opinion it is a misconception that React "mixes" representation and logic.

You can _implement_ both representation and logic with React. (instead of JS for logic, and some clunky template language for representation).

This does not mean that you should mix it. usually you end up with "representation" components that are "dumb", and logic components, that do not care about the representation of their children.

see https://medium.com/@dan_abramov/smart-and-dumb-components-7c...

Just because it shares the implementation mechanism, it does not mean that they are mixed together. You can of course, but most of the time, you should not.

Re:A Primer for Building Single Page Applications with React by jbergens on Wednesday March 25, 2015 @05:57AM (#9261964)
This is a great way of separating things. We did this (or something very similar) years ago with ASP.NET and it worked like a charm.
Re:A Primer for Building Single Page Applications with React by rudasn on Tuesday March 24, 2015 @10:41AM (#9256862)
Keep in mind that the notion of separation of concerns (markup, style, behaviour) mostly refers to the end result, the rendered page. Performance is a good reason for doing this.

In other words, use css classes to style similarly looking elements instead of defining the styles inline (style attribute). Or use event delegation instead of adding a bunch of onClick attributes on your elements.

When talking about developer productivity (ie. maintenance, new feature development) what's more important than separation of technologies is separation of concerns at the "component" level.

Component in this context can be simply defined as a single file that contains all the logic required to render and manipulate a single DOM element throughout its lifecycle.

What React does (as is Angular to a lesser extend) is allow you to mix markup and behaviour while developing but keep those things separate when generating the end result.

Re:A Primer for Building Single Page Applications with React by matthewmacleod on Tuesday March 24, 2015 @07:42AM (#9255954)
I do undestand where you come from there, but I'd view this as a bit different.

React's building block is the 'component' – the idea being that this is an isolated part of the application. By its very nature, isolating a component means separating the HTML from all the other HTML, and the script from all the other script.

Since components are generally quite small, it makes sense to bundle these together. You don't suffer the problems that encouraged people to separate concerns in the first place (things like have loads of interacting code that's duplicated and closely tied to structure), so it's OK to take a different approach – and I must say, in practice it works really well.

CSS is a separate issue – React doesn't mix CSS into the pot at all.

Re:A Primer for Building Single Page Applications with React by masklinn on Tuesday March 24, 2015 @09:35AM (#9256416)
> CSS is a separate issue – React doesn't mix CSS into the pot at all.

Not quite true, ReactNative does, React supports it[0] and one of the lead devs (vjeux, gave the reactjs conf 2015 keynote) has a presentation on doing exactly that[1] alongside being the lead dev on Facebook's css-layout (which IIRC underlies ReactNative's layouting)

[0] https://facebook.github.io/react/tips/inline-styles.html

[1] https://speakerdeck.com/vjeux/react-css-in-js

[2] https://github.com/facebook/css-layout/graphs/contributors

Re:A Primer for Building Single Page Applications with React by philbo on Tuesday March 24, 2015 @08:26AM (#9256125)
Do people generally write tests for these components? I'm wondering how the marrying of presentation and logic affects that.
Re:A Primer for Building Single Page Applications with React by masklinn on Tuesday March 24, 2015 @09:42AM (#9256452)
> Do people generally write tests for these components?

Sure. React even ships with testing utilities to make that easier: http://facebook.github.io/react/docs/test-utils.html

> I'm wondering how the marrying of presentation and logic affects that.

Depends on the exact component. For pure components as part of bigger applications it's really quite easy, just render the component with a known dataset and see if it's got everything where things should be. Then again, that's similar to testing templates… most people don't really test their templates.

For self-contained "widget" components things are a bit harder, it's similar to testing DOM-based widgets really.

Re:A Primer for Building Single Page Applications with React by nicksellen on Tuesday March 24, 2015 @07:32AM (#9255908)
The idea was approximately that html was the data and css was the presentation. In reality they are quite connected and you have to write the html to support how it will be presented, a change to the presentation often requires a change to the data (html), and this doesn't really make sense.

I think a saner approach is to start with plain old data (e.g. some JSON) and have a function that can turn that into html/css/js. This is what react allows by using props/state as the input to the component/rendering function. It also permits you to pass complex objects as props/state but I like keeping to simple data as much as possible.

Re:A Primer for Building Single Page Applications with React by pjtops on Tuesday March 24, 2015 @06:27PM (#9259951)
If changing CSS requires changing the markup, you are doing it wrong. Look into approaches like BEM, and demo sites like CSS Zen Garden.
Re:A Primer for Building Single Page Applications with React by nicksellen on Thursday March 26, 2015 @08:24PM (#9274072)
Changing the presentation often involves more than changing the CSS alone. For example, you might have a table of data that you want to change into a bootstrap .row/.col structure. The data itself has not changed, only the presentation, and this required a change of HTML.

The CSS always needs enough hooks in the HTML to do it's work, without the right hooks some things are impossible with CSS alone (or would be unnecessarily obscure/tricky/brittle).

HTML isn't a general data format in the way JSON is.

Re:A Primer for Building Single Page Applications with React by Swizec on Tuesday March 24, 2015 @06:59AM (#9255826)
As someone a bit less new to React. This is leaps and bounds better than the Angular approach.

My favourite part is passing functions and complex objects as element properties. Very useful.

Re:A Primer for Building Single Page Applications with React by dada78641 on Tuesday March 24, 2015 @07:31AM (#9255905)
Basically, the paradigm has you make small components with the JS, HTML (actually XML) together, and optionally the CSS too. The reason why this works is because the HTML and JS work together to make up the structure of your component, so there's not really much of a reason to separate them. And if your component is nice and small, there's only a small amount of HTML to worry about.

The idea is to think of your HTML as a part of your app, rather than just "something that is modified by the JS".

Re:A Primer for Building Single Page Applications with React by ripter on Tuesday March 24, 2015 @02:14PM (#9258367)
I have the same feelings. That's why I like projects like http://www.ractivejs.org/ and http://rivetsjs.com/ . They have the productivity benefits without forcing you to use JSX.
Re:A Primer for Building Single Page Applications with React by Andir on Tuesday March 24, 2015 @08:31PM (#9260549)
I wouldn't say I was "forced" to use JSX. I started out building React using only JavaScript notation to build the DOM (React.DOM.div, et al.) because I told myself that XML formatted text doesn't belong in my JavaScript. I then started to use JSX. It's a beautiful thing to get into if you give it more than a cursory glance. For one, readability is incredibly better with JSX and passing data becomes less of a chore.
Re:A Primer for Building Single Page Applications with React by odiroot on Tuesday March 24, 2015 @09:42AM (#9256451)
In my humble opinion it makes sense. At least in this direction, when (seemingly) JS code is generating the presentation layer (HTML in this special case).

In contrast to Angular where we're told to put logic in templates (or just HTML files) it looks a lot better.

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @09:30AM (#9256387)
Absolutely, React is in the wrong here and its methodology is a clear and direct violation of the "separation of concerns" principle.

First, they came for the HTML markup and said "come on guys, JSX is just some XML on steroids. You should not worry at all" and we didn't speak up.

Then they came for CSS and said "come on guys, they're just small components and the same as placing the CSS declarations via the style attribute anyway blah blah blah" and we didn't speak up.

So you don't really know what's gonna be their next victim. There's a lot of revisionism and reinterpretation of best practices going on in the industry and hipsters and fanbois seem to go chasing the latest shiny and trendy object out there.

Nothing we can do to help save these people!

But seriously guys, have you seen any React dev code with all those CSS declarations and HTML markup over each other?

I pity the ones who will be assigned maintain this spaghetti code.

Re:A Primer for Building Single Page Applications with React by nwienert on Tuesday March 24, 2015 @11:58AM (#9257419)
I've actually never found myself more productive than with React, by a long shot. The reasons why mixing them together makes sense are above us in the thread, but I'd highly recommend vjeux's presentation on CSS in JS:

https://speakerdeck.com/vjeux/react-css-in-js

I have apps in production with it you can look at the code to as well:

https://github.com/reapp/hacker-news-app

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @12:13PM (#9257507)
vjeux's presentation only applies to a very specific use case at his org namely FB. I should not imitate him just because of the fact that it fitted or served FB right. We should think on our own and figure what works for us and not blindly follow FB's or any other org's lead.

Re productivity, if it works for you, good for you but please don't attempt to reinterpret/bend the rules that are well established in the industry just to avoid criticism. For me, it's just an act of intellectual dishonesty.

React does violate the principle of separation of concerns and "we're working on a component not a document level" is not fooling anyone.

We should alert and educate people on this issue and then they can decide for themselves if they would go ahead nevertheless or stick to their guns. That's all!

Re:A Primer for Building Single Page Applications with React by nightski on Tuesday March 24, 2015 @01:04PM (#9257850)
I am curious, what concerns are not being separated? You have presentation markup with presentation logic. Actually it seems to me the concerns are being brought closer together.

Or are you making artificial boundaries between declarative and imperative code?

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @01:26PM (#9258008)
I'm OK with presentational markup co-existing with logic but to be honest I prefer it the template way not the other way around where the markup is the guest at the JS file.

But throwing CSS declarations to the mix is just too much for me. Now I'll have to maintain markup/presentation/logic in the same place, that's a nightmare and ticking bomb IMHO.

Re:A Primer for Building Single Page Applications with React by mejari on Tuesday March 24, 2015 @02:12PM (#9258356)
>Now I'll have to maintain markup/presentation/logic in the same place

Only if you're doing it wrong. Presentation logic and markup will be in the same place sure, that's a good thing, but any application logic not dealing directly with displaying dom elements shouldn't be in and among your presentation code. Your concerns are separated and your presentation code is in the same place, like you would logically think they should be.

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @05:34PM (#9259652)
What about bringing CSS declarations to the mix?

I have watched React Native talks in which they were advocating for this and bluntly calling it proper "separation of concerns".

But when you say that presentational markup and logic should be grouped together, doesn't this mean that we have to divide our js files even further to separate business logic from presentation or view logic?

Re:A Primer for Building Single Page Applications with React by uptownJimmy on Tuesday March 24, 2015 @12:26PM (#9257602)
I don't give a hoot about "separation of concerns" unless it makes really, really good sense, which it often does not.
Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @12:37PM (#9257690)
Fair enough but please don't go around telling that mixing content/presentation/logic in a single entity is a valid case of "separation of concerns" but on a micro and not macro level. That's just not right!
Re:A Primer for Building Single Page Applications with React by uptownJimmy on Wednesday March 25, 2015 @08:39PM (#9267063)
There's a lot of things that may or may not be "right", and I'm not trying to do them, either...
Re:A Primer for Building Single Page Applications with React by mejari on Tuesday March 24, 2015 @01:34PM (#9258072)
>We should think on our own and figure what works for us and not blindly follow

But doesn't your last comment rail against all these "fanbois" not blindly following "best practices" and actually attempting to find out what works best?

In fact, your next sentence in this comment:

>please don't attempt to reinterpret/bend the rules that are well established in the industry

You seem to be contradicting yourself.

Re:A Primer for Building Single Page Applications with React by timepiece on Tuesday March 24, 2015 @01:59PM (#9258277)