Fork me on GitHub
#clojurescript
<
2016-11-08
>
johanatan00:11:22

@dnolen does that mean I should see a tree of files rather than just a single .js?

hueyp00:11:50

@johanatan here is a writeup on code splitting / deferred loading : https://rasterize.io/blog/cljs-dynamic-module-loading.html (haven’t done it myself)

johanatan00:11:25

@hueyp ahh, so this isn't automatic. any reason why the compiler can't just auto-modularize on CLJS module boundaries? @dnolen ?

johanatan00:11:43

[the latter being my expectation going into this]

dnolen01:11:51

@johanatan doing it around human module boundaries doesn’t actually generate optimal modules

dnolen01:11:37

Google Closure actually employs cross module code motion so the production “modules” represent the actual optimal code split

johanatan01:11:03

@dnolen: I'm confused. Are you saying that GC actually does automatically break things into production modules and that the article that @hueyp shared is only for if you want to or need to override that?

dnolen01:11:20

the article @hueyp shared is how it’s done

dnolen01:11:55

however this is just to tell GC what must belong to a specific “module”, but GC will create the true optimal split

dnolen01:11:03

and this has nothing to do with the namespaces you wrote

dnolen01:11:15

GC can move even a single function into the code split module where it belongs

dnolen01:11:35

anyways nothing is going to change here

dnolen01:11:03

Google believes their approach produces optimal splits and based on the amount of data they have about stuff like this - I’m inclined to believe them too

ghaskins02:11:55

Hi All....so, I have this clojurescript+nodejs command line app that works awesome...now I want to give it to others like QA to consume...im struggling to find a good model to package this thing up because of two issues: 1) the nodejs target of course emits a tree of files instead of the single browser.js you get elsewhere, and 2) some of the npm deps I am using have native .o builds (GRPC, etc).

ghaskins02:11:09

im wondering if there is any advice out there?

ghaskins02:11:35

even something like "lein npm install -g" would be fine, but this doesnt seem to produce what I expect or can figure out how to invoke

ghaskins02:11:51

to date, all I can do is manually invoke it like "node path/to/main.js"

ghaskins02:11:18

any help appreciated

ghaskins02:11:29

to put it another way, I am not constrained to need platform/arch neutral packaging (though this would be a bonus) but rather the most idiomatic way to produce something straight forward for others to share/use

akiroz02:11:57

hello~ anyone know if there's an easy way to get a cljs repl in the terminal like clj on linux?

ghaskins02:11:01

@akiroz I dont know if I would classify it as "easy" but there I have been successful with figwheel

akiroz02:11:26

I want something like a command I can run anytime instead of having to cd to my sandbox project, run lein figwheel and open a browser to test something simple

ghaskins02:11:52

sorry...i thought you wanted the basics, you are already where I am

ghaskins02:11:25

fwiw, I do have it working in the terminal, not browser

ghaskins02:11:37

but I do have to go into the project and drive it from there

ghaskins02:11:57

(though I suppose that isnt much different from jvm-clojure repl

akiroz02:11:32

how did you get a cljs repl without using a browser? 😮

ghaskins02:11:46

im looking at my project now

ghaskins02:11:59

ah, ok, heres a caveat which might make the difference

ghaskins02:11:10

my app is a nodejs command line app, not a browser app

ghaskins02:11:31

so, the repl runs in the terminal, and my app runs in the terminal, but I suspect that is not your use case

ghaskins02:11:04

(at first, I thought you were saying your repl was running in the browser, but after looking at how I run it I kind of doubt thats what you meant)

akiroz03:11:33

That sounds like it could work actually! I'll just write a (loop (print (eval (read)))), compile it to a node js file and run node repl.js

akiroz03:11:49

maybe alias that in my shell

ghaskins03:11:04

but yeah, thats essentially what I do

ghaskins03:11:18

and then, I run "lein figwheel repl" to launch the repl in one terminal, and node repl/repl.js in the second

ghaskins03:11:42

def not as slick as jvm-clojure repl work, but it does work

ghaskins03:11:11

tangental tip: I also use rlwrap on the repl

ghaskins03:11:37

e.g. rlwrap lein figwheel repl

akiroz03:11:19

cool, I think I'll do alias cljs='rlwrap node ~/scripts/repl.js' for quick access 🙂

ghaskins03:11:28

nice, good luck!

tiensonqin03:11:51

For generating externs for google closure advanced compilation, I find an actually pretty old idea from https://gist.github.com/Chouser/5796967, make some changes to the gist, now it works for some react native apps of mine. https://github.com/tiensonqin/exponent-cljs-template/blob/master/resources/leiningen/new/exponent/env/dev/externs.clj

seantempesta04:11:44

Please correct me if I’m wrong. If I’m calling a function in a normal javascript package that I don’t have externs for using the (.functionName js-object js-arg) format, then it won’t survive advanced compilation, right? So the safe way to do it is to ((aget js-object “functionName”) js-arg)?

tiensonqin06:11:55

@seantempesta Yeah, I think so. ((aget js-object “functionName”) js-arg) is too tedious, externs.clj already helps this one, currently it don’t support: 1. (.-member js-object) 2. (ui/Facebook.logInWithReadPermissionsAsync …args) 3. ui/Permissions.REMOTE_NOTIFICATIONS I’m starting to learn the cljs analyzer, as long as the ast has all the informations we need, maybe we can solve this problem. I’m not expert on cljs or google closure, so maybe I’m wrong.

johanatan06:11:54

@dnolen: How can GC know about temporal relations of functions? It would seem that part of being "optimal" here would involve putting functions likely to be called later into the deferred modules. And I wasn't asking for anything to change-- just trying to understand how it all works now and if I need to do anything (such as outlined in that article @hueyp posted) to get the benefits.

thheller08:11:29

@jonathan you need to define the entries of each module (ie. a ns with a function in you will call when you load the module). You then need to define how the modules depend on each other. Given that information the GC will move things around.

thheller08:11:45

It will follow the entry and everything called by it

thheller08:11:59

If some code is only called by that entry it will be moved to its module

thheller08:11:09

quite simply really

pseud09:11:56

Hey, would the community weigh in on their boot/lein preference and more importantly - some reasoned arguments as to why they favour what they do

seantempesta09:11:21

Is there a reason the clojurescript compiler doesn’t automatically generate externs when it sees we are accessing javascript properties or calling javascript functions? Is there any other reason to use the (.-attr or (.fn-name operators?

seantempesta09:11:10

Or at least convert those references to (aget js-obj “js-attr”) and ((aget js-obj “js-fn”) js-args)?

dnolen12:11:06

@seantempesta yes you would damage dead code elimination and other production build optimizations

dnolen12:11:02

@pseud an interesting question but this isn’t really the right channel for that discussion

dnolen12:11:13

@tiensonqin @seantempesta there’s a ClojureScript repo branch called externs-infer which will attempt to do what you all are describing in a more disciplined way

dnolen13:11:11

@tiensonqin yes it looks likes Maria wrote some nice stuff we should use for knowing what things we already have externs for - should just copy that

dnolen13:11:51

my branch goes a bit further in propagating extern info for inference in local contexts

dnolen13:11:07

as well as support via type hints

tiensonqin13:11:07

I’ll learn both repos, don’t know too much about cljs internals. Thank you for your help!

darwin14:11:36

@seantempesta give cljs-oops a try

emil0r14:11:50

is there a way to have (type x) match against the protocol in clojurescript like you can have it in clojure with class?

emil0r14:11:05

#?(:clj (defmulti branch? class)) #?(:cljs (defmulti branch? type)) (defmethod branch? :default [_] false) #?(:clj (defmethod branch? clojure.lang.IPersistentVector [v] true)) #?(:clj (defmethod branch? clojure.lang.IPersistentMap [m] true)) #?(:clj (defmethod branch? clojure.lang.IPersistentList [l] true)) #?(:clj (defmethod branch? clojure.lang.ISeq [s] true)) #?(:cljs (defmethod branch? cljs.core/PersistentVector [v] true)) #?(:cljs (defmethod branch? cljs.core/PersistentArrayMap [m] true)) #?(:cljs (defmethod branch? cljs.core/List [l] true)) #?(:cljs (defmethod branch? cljs.core/IndexedSeq [s] true)) #?(:cljs (defmethod branch? cljs.core/LazySeq [s] true)) #?(:cljs (defmethod branch? cljs.core/Cons [s] true))

emil0r14:11:33

the clojure variant catches everything that implements IPersitentVector for example

emil0r14:11:47

can’t seem to find something for clojurescript that works the same way

darwin14:11:54

@emil0r I think you want to use satisfies?

dnolen14:11:15

@emil0r there’s really no way currently to accomplish that in ClojureScript

seantempesta14:11:08

@dnolen: Please excuse my ignorance of compilers in general, but couldn’t the compiler check to see if externs are available for the variable in question, and then decide whether to enable optimizations?

seantempesta14:11:28

@darwin: cljs-oops looks perfect. Thanks for the tip!

dnolen14:11:42

@seantempesta I don’t understand what you are asking

dnolen14:11:59

I’m only stating how Google Closure Compiler works - we don’t have control over many of the optimization details

seantempesta14:11:23

Ah, I see. Well thanks for clearing that up. Also thanks for everything you’ve done for clojurescript. It’s so nice to be able to write in a sane language. 🙂

dnolen14:11:02

glad you’re liking it!

darwin15:11:16

what is the best way to detect that my macro is being expanded from clojure as opposed to clojurescript?

darwin15:11:54

I remember people were checking existence of something in &env

moxaj15:11:01

@darwin (boolean (:ns &env))

moxaj15:11:21

@darwin true in clojurescript

darwin15:11:19

let’s hope, Clojure won’t add :ns into env in some future version 😉

johanatan17:11:00

@thheller I think you misunderstood my question. ClojureScript is a dynamic language. This means that static analysis cannot in large part determine when various functions will be called. Since part of the allure of the module system is its ability to "defer" loading of chunks of code until the point when they are actually needed, this inability to determine temporality of such chunks is defeating to that effort.

thheller17:11:49

@jonathan why is that important? you define the entry, if that entry is the only one to use cljs.core.something that something will be moved into that module

thheller17:11:26

but yes you need to manage WHEN to load each module

thheller17:11:38

since only you can know when you need it

johanatan17:11:42

@thheller I'm referring to the natural state where you leave GC to decide the module boundaries as @dnolen mentioned

johanatan17:11:59

not to the explicit management of it as outlined in @hueyp 's posted article

thheller17:11:13

you always define the module boundaries, it cannot be left to GC

dnolen17:11:22

@johanatan I think what can be said about how it works has been said

johanatan17:11:35

@thheller that isn't what @dnolen indicated

dnolen17:11:36

we rely on Google Closure to figure it out and we’re not going to do anything else

thheller17:11:22

well boundaries as in entries

dnolen17:11:28

part of the confusion here might be conflation of of terminology

johanatan17:11:48

@dnolen once again, I'm not asking for anything to change. I am only asking what I am asking.

thheller17:11:58

yeah definitely .. too many uses of module

dnolen17:11:09

A) namespaces B) Google Closure modules which are a code splitting feature and has nothing to do with A)

dnolen17:11:27

other than when you want the code split, you specify which namespaces you want to for sure in a split

dnolen17:11:43

but GC will do more to figure out how parent namespaces will fit into that split

dnolen17:11:15

@johanatan there’s nothing more to say about that

dnolen17:11:39

but you keep combining a bunch of things which are considered separately by Google Closure

johanatan17:11:54

No, I'm referring to B when I use the word "module"

dnolen17:11:59

how to load a code split is a manual thing

dnolen17:11:15

all of this stuff is separated

dnolen17:11:22

A) namespaces B) code splits C) loading code splits

dnolen17:11:31

they will never meet - get used it

johanatan17:11:05

Hmm, ok. Well what did you mean by "but GC will create the true optimal split" ?

dnolen17:11:13

I’ve already explained that

dnolen17:11:20

Google Closure cross module code motion

dnolen17:11:28

if you really want to understand look at the compiler code

dnolen17:11:43

@johanatan I wrote a very short post about it more than a year ago if you want an overview

johanatan17:11:24

Ok, so you're saying that if I define N splits and give it some namespaces that I want in each, GC will try to aim for that but will still migrate chunks of code as appropriate. But, if I say define zero splits, GC won't migrate anything anywhere and there will end up being just one .js with everything in it?

johanatan17:11:49

Ok, perfect. Thx for bearing with me

wilkerlucio18:11:05

@dnolen nice! thanks for the notice

nikki18:11:58

The scopes are reified and don't involve mutable updates, so can be persisted etc

nikki18:11:51

in a way similar to clj(s), tries to rebuild basic things on top of a few primitives. here given just the scope thing does function arg passing, local variable defs and self-like OO.

nikki18:11:13

was inspired by the dynamic scoping in cl/clj(s)

sophiago18:11:06

this should be a fairly easy question: ideal tools for benchmarking cljs vs. js? not sure if it's relevant if i'm using om and react respectively. thanks!

dnolen18:11:11

@sophiago browser based profiling tools are probably the best option

dnolen18:11:30

that said in my experience, the results can be surprisingly different across browsers

sophiago18:11:30

ah, just run a chrome devtools profile?

sophiago18:11:42

idk why i didn't try that before asking

sophiago18:11:12

i suppose because the variance and such...

dnolen18:11:37

yes lots of things contribute to React performance, not just time spent in JS

sophiago18:11:35

but not like i'd find something like criterium in this case for the many obvious reasons. i was hoping for something maybe inching towards that

dnolen18:11:11

yeah nothing like that I’m aware of

dnolen18:11:23

comparing simple JS to CLJS is way easier

dnolen18:11:55

I don’t know that trying to measure CLJS/JS React perf will be interesting without a bewildering array of tests

sophiago18:11:47

yeah exactly. i find profiles more useful for debugging

dnolen18:11:49

3 years ago I when I was testing CLJS+React I was satisfied with the generic conclusion “it’s not slow” 🙂

sophiago18:11:44

right, like as a library developer you'd see if you massively screwed something up. when i write code that does a lot on the gpu it's more useful for speed. but looking for "om is x magnitudes faster than my previous workflow" i doubt i'll get in any way at least i'd believe

sophiago18:11:45

but i have to think i'm getting a very significant speed up along those lines, especially with lifecycle managed for me, just too many factors for a profile to encompass them all

dnolen18:11:27

having watched people use Om for years now, it’s not my impression that people see performance benefits over plain React

dnolen18:11:32

similarly for Reagent or whatever

dnolen18:11:51

but everyone just likes the simpler programming model + Figwheel makes everyone feel productive

sophiago19:11:54

well thank for the anecdotal evidence. that's worth a lot. i certainly didn't think it was slower. and om.next is a massive improvement in workflow for me coming from using the top-level api. i suppose it's just the react overhead adds so much the speed of cljs over js isn't doing much is the point?

dnolen19:11:14

that’s exactly right

dnolen19:11:16

React dominates

sophiago19:11:51

otoh, if i make use of om.next's network routing interfacing it with the backend code that might change drastically. again, though, tough to measure

dnolen19:11:57

@sophiago fwiw, my impression of people that make the jump from React to ClojureScript is that they like the fact that the whole community is unified around simple React architecture

dnolen19:11:06

immutability, simple atom app state

dnolen19:11:18

and Figwheel just crushes the hot loader stuff in React

dnolen19:11:29

because everyone is writing simpler code with less mutation

dnolen19:11:37

like the whole ecosystem

dnolen19:11:07

also I don’t really like where JS tooling went at all

dnolen19:11:31

Webpack, Babel, gulp, grunt - it’s all become a plugin mess - not actually delivering on modularity

dnolen19:11:03

so I hear that as well - users like the fact ClojureScript just deliver JS module management to everyone in a unified way

sophiago19:11:16

yes, that was obvious in one day. my point in the last statement was about resetting between UUIDs, though. i'm not sure how far those performance gains in rendering go. it doesn't seem like outside of om there's much use of that...like a hidden feature almost

sophiago19:11:35

ugh, yes i won't touch webpack

shaun-mahood19:11:38

@sophiago: You might find this post interesting - not specific to CLJS at all, but it seems pretty relevant. http://elm-lang.org/blog/blazing-fast-html-round-two There are also some alternative VDOM implementations in CLJS if you want to follow the rabbit hole further - no idea if there are any comparisons of them against react or anything like that though

sophiago19:11:34

@shaun-mahood thanks! i'll give it a look

shaun-mahood19:11:38

Oh, and the original post included Om, which came in quite a bit faster than React at that point.

sophiago19:11:55

oh, interesting

shaun-mahood19:11:23

2014 though, so a lot has changed since then on all fronts

sophiago19:11:48

yeah, it wouldn't even be the version of om i'm using at all so not sure i should be quoting any of it

sophiago19:11:52

re: webpack...the thing i wonder (having always avoided jsx) is if facebook doesn't want to help develop it what will they do if it falls apart?

sophiago19:11:57

last i remember it was mainly developed by one guy! they chose to make the main react workflow rely on a somewhat arbitrary tool developed by one guy their multibillion dollar company doesn't employ...

dnolen19:11:36

yeah it’s kind of problem in the JS ecosystem

dnolen19:11:57

in comparison Google Closure Compiler for all of it’s lack of visibility is a healthy project with many devs delivering core functionality

dnolen19:11:18

and they’re fixing the JS module problem for us - we’ll just ride on that for free

dnolen19:11:27

(well the parts of module problem that we care about anyway)

sophiago19:11:31

well that points to very different attitudes towards open source

sophiago19:11:00

although i heard at long last React has up to date tutorials for beginners?

dnolen19:11:46

yeah it’s tough, Google Closure Compiler has horrible documentation and marketing - but solid technology

dnolen19:11:11

I hope that ClojureScript can over time provide the best documentation / front end to it

sophiago19:11:00

there's maybe some irony of needing good docs when you have so much less resources

sophiago19:11:49

huh, this is interesting: a skim view shows the new React tutorial looks really good feature wise, but they sidestepped their whole deprecated babel-browser issue by just using codepen and not mentioning how to build it at all in the entire thing. i guess you get quite far before realizing the entire tooling ecosystem you're signing up for...

sophiago20:11:21

@shaun-mahood that elm article has many points that seem awfully specious... one being how optimizing react requires "refactoring" it into smaller and smaller components, when that's just how react should be used from the start...or basic modular library design for that matter. the other being how they immediately wrote off optimizations based on immutable data structures because they're too hard for their developers or something then went into array allocation? i've never used elm and am not sure who actually wrote this thing, but it appears they missed the two main points behind all of frontend dev (both React and Angular2) in the time period they're discussing

sophiago20:11:21

i also don't know how i can believe those two year old figures claiming over a 50% speedup using om vs. react based solely on immutability based on David saying React's overhead massively trumps those considerations

shaun-mahood20:11:57

@sophiago: It was written by Evan Czaplicki, the creator of Elm - based on everything I've read and seen that he's done, I would tend to give him the benefit of the doubt for most things.

dnolen20:11:04

@sophiago the VDOM stuff is a distraction

dnolen20:11:21

nobody is actually achieving an order of magnitude over React in terms of perf

dnolen20:11:26

and only React is delivering iOS & Android

sophiago20:11:58

ok...so the old figures are perhaps sketchy in some way?

sophiago20:11:26

and my main thing immediately was he clearly didn't seem to understand the React workflow

dnolen20:11:33

no those Elm numbers look fine

dnolen20:11:40

but I’m just saying “so what?” 🙂

sophiago20:11:56

like his "unoptimized" version appeared to have what, like a few large components doing everything?

pseud20:11:13

That’s not strictly true. Phonegap / Cordova allows throwing regular webapps on a phone with API’s for interfacing with phone-specific features like the camera. You can then, provided your environment allows JS interop, use whatever frontend technology that makes you happy.

sophiago20:11:27

well, it's not like i'm switching from what i've been doing for a while. the whole analysis just strikes me as having many odd points

dnolen20:11:51

@pseud lots of people have assessed Phonegap / Cordova and believe them to be wanting

dnolen20:11:55

React Native is popular for a raeson

sophiago20:11:09

i don't know many people who use Phonegap in 2016

dnolen20:11:47

in anycase, it’s not about anti-Phonegap/Cordova

dnolen20:11:59

clearly it’s not good enough for many products

pseud20:11:51

Every solution is wanting, you’ll also find plenty of posts saying React native isn’t as great as it’s made out to be if you’re actually trying to target Android and iPhone both. Granted, React native might be less broken (I really don’t know), but Cordova/Phonegap draws its strength from how closely it resembles regular webapps and thus how easily skills transfer. Mocking a few things out and you can basically work & test on a PC should you want.

dnolen20:11:22

@pseud I’m not in disagreement

dnolen20:11:48

but I’ve also talked to plenty of people who didn’t think Cordova was the answer for “native” clients

dnolen20:11:02

and I’ve talked to people who have shipped ClojureScript React Native and are happy

dnolen20:11:47

as far as Elm, I only have nice things to say about it from what I’ve seen

dnolen20:11:13

but I’ve also heard from serious users stuff we’ve already solved

dnolen20:11:35

Elm doesn’t run on the backend (Clojure does), we have a much more sophisticated production build story thanks to Closure etc.

sophiago20:11:03

i'm mainly left confused about the om vs. react numbers from two years ago, but perhaps i should take them with a grain of salt

sophiago20:11:40

or just try myself...

dnolen20:11:50

@sophiago if you can write simple React apps that work purely via reference equality checks for shouldComponentUpdate you can replicate the results

johanatan20:11:52

@dnolen the first link on "In Stillness, Movement" (Google Closure Modules) seems to be broken. Do you have a better link for it?

dnolen20:11:14

but my experience is that for non-trivial stuff, you won’t see such big gains - it’s also why om.next doesn’t work that way anymore

dnolen20:11:25

incremental precise rendering is more important

sophiago20:11:21

ah, ok. yeah, i didn't understand om to diff any less often than react. you're saying it can/used to for a small percentage of use cases

dnolen20:11:56

@sophiago yes, it doesn’t scale as the component tree deepens - you still have to check too much

dnolen20:11:05

especially if something small deep in the tree changed

dnolen20:11:25

but if the tree is flat and not that wide, the trick is blazing fast

dnolen20:11:52

@johanatan thanks, but not that important to me

sophiago20:11:12

this does explain the analysis then because he seems to be saying elm isn't so modular (no experience personally) compared to React or Angular2

dnolen20:11:38

@sophiago well Elm doesn’t really have this notion of components

sophiago20:11:03

well that would explain why they can get a slight speedbump in those current benchmarks

dnolen20:11:03

something which I think is still quite useful even in a mostly functional approach to UI

sophiago20:11:20

i think "nearly 50%" is not so huge tho

sophiago20:11:29

but depends on what you're doing

tomc21:11:37

How impractical would people say it is to use clojurescript in an environment where I want to keep my script size down to around 130KB? Playing around with this a bit, it seems like this will be hard to achieve if I make use of persistent data structures and the core library at all.

tomc21:11:01

Actually, I realized my constraints aren't all that restrictive - still interested to hear what people have to say about this though. In particular, has anyone written anything significant in cljs that completely avoids the built-in data structures and core lib for the sake of keeping the built size as small as possible? Avoiding javascript's syntax might be enough to make that worthwhile...

sophiago22:11:57

@tomc that sounds totally possible dude to removal of deadcode by google closure. are you just comparing the cljs files or the compiled js?

tomc22:11:36

I looked at the advanced compiled js - my decision after experimenting with this for a while is that it's doable but probably unpleasant. You really can't use anything in the core lib without checking its implementation to be sure it won't bloat the output. A hello world that uses (.log js/console) is tiny - about 16KB if I remember correctly, but one that uses (prn) pulls in a lot of clojurescript code, ending up around 90KB. If I ever have the need to deliver really small output files I'd consider doing that over working with javascript directly, particularly if I was already using clojure, but fortunately I was wrong earlier about my requirements, so I can continue on w/ immutable data.

sophiago22:11:36

i'm confused. if you're saying you need to write javascript directly then the answer is still that clojurescript compiles to tiny javascript, it's just that your handwritten javascript is making the files magnitudes larger

sophiago22:11:25

you'd be better off writing the javascript inside clojurescript and then still being able to transcompile it

sophiago22:11:42

otherwise you can get rid of the clojurescript parts and still be left with js that's far too large for your needs

dnolen22:11:54

@tomc JavaScript developers generally consider and compare the gzip size - it’s certainly the case that’s the only thing we’re actually concerned about

dnolen22:11:20

@tomc eliminating (all of) the standard library / core data structures isn’t possible - so you’re looking at > 25K gzipped to do anything at all

dnolen22:11:48

but if really you’re just looking for something that generates absolutely minimal output - then ClojureScript is probably not the right choice

tomc22:11:05

@sophiago sorry I was unclear - I wasn't saying that I need to write javascript directly, just that I think (very non-idiomatic, interop-full) clojurescript could be a reasonable choice over javascript where built script size is highly constrained, just because clojure has a better syntax.

tomc22:11:29

@dnolen - I was looking at the non-gzipped size because even the perception that the script is large (by non-developer folks who happen to know how to look) actually matters a bit for my use case. Not tremendously though, and that's why I'm not worrying about it.

dnolen22:11:13

@tomc ah k - yeah it’s just not something we consider much - production assets nearly always end up on some CDN and served gzipped