Is it better for Discourse to use JavaScript or CoffeeScript?


(Chris S.) #14

TypeScript!

Tumbleweed

It’s still Javascript, but sadly the compiler is Windows only and a bit VS centric.


(Simon) #15

I don’t understand the problem here. Which parts of CoffeeScript require “new syntax” in JavaScript? Isn’t the problem exactly the same if you were using “plain” JavaScript, that at some point in time, if some breaking change occurs in some future version of JavaScript, you would have to change your code? And who says that the CoffeeScript compiler couldn’t be updated to emit proper ES6/ES7/whatever code in the future, just like any compiler (C/C++/Java/…) is able to produce binaries for different platforms or is able to use different language versions.

As far as I understand it, the idea behind CoffeeScript is exactly to have some higher level language that just compiles to “some standard” JS. And if somehow CoffeeScript was abandoned and no one could update the compiler anymore, you still could just compile your CoffeeScript one last time and use the compiled JS in the future.


(Tim Stone) #16

Hmm, I may have to backtrack on my original opinion after giving this more consideration.

While I have been able to figure out how things work without too much issue despite not having a deep familiarity with either CoffeeScript or Ember, the combination does introduce a level of friction that makes me far more cautious when making changes.

I imagine that if the codebase was purely JavaScript, which I’m confident with, I’d be able to focus more easily on understanding the Ember side of things without worrying that I missed some CoffeScript shenaniganery that might not produce exactly the behaviour I was after.


(Dan Neumann) #17

While we’re deep in bikeshedding zone,

The pretext in the responses seem to be that enough hypothetical proficient Ember.js devs are going to be dissuaded from contributing to Discourse at such a substantial rate that it’s worth getting rid of Coffeescript.

And that it ostensibly outweighs the benefits that non-hypothetical, real-life Discourse contributors experience while maintaining a Coffeescript codebase, particularly that of the core dev team.

:bike: :house:


(J.A.) #18

CoffeeScript has significant whitespace.

So instant no. It makes it a pain in the butt to parse. It’s annoying. Most people (except for Python developers) don’t like it. Due to being difficult to parse, you will have problems when you try to refactor. Not to mention the problems of re-indenting everything when you have really long and ugly blocks you want to clean up (happens).

Stick with JS. More people are experienced with JavaScript afterall and critical mass in attracting developers is important for Discourse.


(Yehuda Katz) #19

Actually, this problem could not occur in JavaScript, because ES6+ will always be backwards compatible with the current version of JavaScript. Further, the “1JS” principle means that you will be able to take existing code and opt into new features simply by using the new syntax (there will be no “use es6” pragma or version switch).

The core difference is that ES6 is, by definition and by requirement, a strict superset of current JavaScript. By definition, there can be no new syntax that is incompatible with existing JavaScript.

In contrast, how would CoffeeScript target the new for/of loops, when they already have for/of loops of their own? Sure, they could add new syntax, but it would be massively confusing for for/of to target the old semantics, and some other syntax to target ES6 for/of.

Similarly, CoffeeScript classes and super have subtly different semantics than ES6 classes and super. If CoffeeScript started targeting the new semantics, they would break existing code. If they required a different keyword to target ES6 class, it would, again, be very confusing.

You could imagine an incompatible CoffeeScript 2 that targeted ES6 syntax, but existing CoffeeScript code would not work. Again, this cannot happen in future versions of JavaScript, because new JavaScript features are required not to break existing JavaScript code.

It may be a bit difficult to wrap your mind around the difference, but I assure you, it’s true.


(David Murdoch) #20

JavaScript all the way. There are way more JavaScript developers than CoffeeScript developers (and more JavaScript devs than Rails devs, I assume). I think you’ll get more contribution by opting keep the codebase in JavaScript.

And as for personal preference: I won’t write CoffeeScript (for free). So there is some evidence right there, @eviltrout! :-p

p.s. CoffeeScript reminds me of VB. And nobody likes VB.


(David Stone) #21

Aside from the points that have already been discussed, I’ve noticed that writing Ember apps in CoffeeScript also just feels a little off. Several of the niceties of Ember, like computed properties, are expressed as extensions on the JS Function prototype:

MyApp.president = Ember.Object.create({
    fullName: function() {
      return this.get('firstName') + ' ' + this.get('lastName');
    }.property('firstName', 'lastName')
  });

This requires you to use parens in CoffeeScript, which kind of defeats the purpose of the significant whitespace:

MyApp.president = Ember.Object.create
    fullName: (->
     @get('firstName') + ' ' + @get('lastName')
    ).property('firstName', 'lastName')

In addition to that, there’s the CoffeeScript class vs Ember extend() stuff, CS iteration vs Ember enumerables, etc. I just think there’s enough of an impedance between using CS and using Ember to make it more appealing to just use pure JS with Ember.


(Sam Saffron) #22

I guess, but less of a hybrid, if every single time I debugged Ruby I had to run GDB and constantly found myself reading C source I think it would be closer. If every time I wrote I line of Ruby I had to construct a mental model of the way MRI is going to translate the thing to C (for example because I need to know its going to wrap up my switch statements in a closure or what have you), we would be a more of a hybrid system.

Well, we have seen almost no contributions from the community wrt refactoring our js and we are a HUGE js app. In contrast we have seen massive amounts of refactoring around the Ruby side of things. Impossible for me to pin this on CS as I have no crystal ball, but it is a fact.

On a personal level I would be happy to never use CS again, I feel my hands are tied in weird ways and it encourages me to write stuff that I probably would never have written in the first place (like 4 levels of nested functions)


(Robin Ward) #23

It seems like the people have spoken.

I’m convinced! I am on board to convert the coffee to regular JS, assuming of course we set up jshint as part of our testing system.


Why coffescript?
JavaScript type safety is hard, and "I'm not smart enough to handle them"
(Peter Wagenet) #24

This seems like a sound decision. If you want any help with setting up automated jshinting, let me know.


(ryanflorence) #25

Wise choice @eviltrout.

I prefer CoffeeScript, personally, its the only language I write in that I don’t think about the language.

However, Discourse is going to (hopefully) be around for a very long time. There are so many things that are going to be difficult for CoffeeScript in the future. For example, default arguments. null in CoffeeScript will defer to the default while in ES6 it will not because null !== undefined. I can’t see how it will target ES6 successfully and keep backwards compat.

Worth noting, CoffeeScript fell off the top 10 list on github. CoffeeScripters usually still like and write JavaScript, including the language’s creator. Discourse will get more contributors with JavaScript without question.

Better create a style guide first.


(nXqd) #26

I prefer jS since it’s better to write in JS since the it will take a bit of time for another contributor to convert the current “Getting Started Guide” or “Tutorial” from Ember and another lib written in JS to coffeescript.


(Dan Neumann) #27

I feel you.

Javascript skills in general are already hard to find.

And since Ember devs are a fractional subset of that, It’s hard enough to find Ember devs that can contribute, JS or CS.

We had this similar discussion at work, but it’s obviously a lot different when you’re hiring people than leaning on open contributions.


(Mikkel Høgh) #28

Thank you, @eviltrout, that makes me a lot more confident in Discourse’s future. Lowering the bar for contributors is a good thing :sunny:


(Sam Saffron) #29

Help, a PR or anything in this area would be much appreciated !


(Peter Wagenet) #30

Not sure how quickly I could get a PR out, but if you want to ping me directly I can at least try to point you in the right direction.


(Benaiah Mischenko) #31

First, whitespace itself is not significant in CoffeeScript, any more than it is in Javascript (where it separates tokens, as in virtually every other language). Whitespace is not significant in Python either - indentation level is. See Python: Myths about Indentation. Coffeescript works the same way.

Second, significant indentation is not actually hard to parse. On the contrary, it’s very simple - I refer you back to the above article. Essentially, the parser simply parses the difference in indentation as and tokens, modifying the level accordingly. While this might be slightly more difficult to parse than bracket-based blocks, it is hardly a “pain in the butt” to parse.

There are several things significant indentation does make harder:

  • Parsing with regexes. Which you should never do in the first place.
  • Mixing tabs and spaces. Which you should never do in the first place.

This is completely subjective (and I suspect it’s probably not true).

… which is much easier than balancing brackets, because it’s obvious at a glance. You already have to reindent when you write code in a bracket language. Now you just don’t have to balance the brackets.

This is the real reason Discourse should use Javascript. Don’t get me wrong - I do prefer Coffeescript, I just think Javascript is more appropriate for the official Discourse client.


(Jeremy Banks) #32

I disagree that indentation-sensitivity is not a type of whitespace-sensitivity, but even if that applies to Python it does not apply to CoffeeScript. CoffeeScript is more whitespace-sensitive than Python. Compare:

jQuery ($) -> bar
jQuery(function($) {
  return bar;
});

with:

jQuery($) -> bar
jQuery($)(function() {
  return bar;
});

It also doesn’t enforce consistent indentation in the same way as Python, allowing for silly cases like this:

[
  1
  ->
  2
  ->
  3
 ->
  4
  ->
  5
  ->
  6
]

Instead of causing a compile error, the mis-aligned -> alters how the indentation of subsequent lines is interpreted.

[
  1, function() {}, 2, function() {}, 3, function() {
    4;
    (function() {});
    5;

    (function() {});
    return 6;
  }
];

I followed the CoffeeScript project on GitHub for a while, and my impression is that there are tons of edge cases in the compiler whose behaviour is poorly defined, varies between versions and may be difficult to replicate without a direct port. Part of the goal of the CoffeeScript 2.0 project was to define the grammar more rigorously, but I don’t know the status of that project.


(Sam Saffron) #33

Some of my pet annoyances

foo = bar ->
  ""
var foo;

foo = bar(function() {
  return "";
});

foo = bar->
  ""

no compily


foo=(bar)->
  ""
var foo;

foo = function(bar) {
  return "";
};