KV Storage, the Web's First Built-In Module
developers.google.com
developers.google.com
Between this and last week's "Skype for Web," are we collectively done with the pretense that the Web is anything other than what Google dictates?
In WHATWG, single vendors typically work on features until they believe they are good enough to be standardized, which is when they are submitted to the WICG. At this point, other vendors and spec editors can take a serious look at the proposal and decide if it should move forward, what changes should be made, etc.
kv-storage has in fact gone through this process, and has overwhelming support from vendors and developers.
aside from this, import maps have been in the pipeline for even longer, and have broad support ranging even into Node.js being involved.
I know it's tempting when a new web feature is announced to claim that vendor is destroying the internet but please take the time to consider all the work that is put in to making the web a better place for you.
KV storage is being worked on in a standards body, the WICG. It has healthy cross-vendor collaboration, including Mozilla (who influenced the API design and naming significantly) and Microsoft (who encouraged us to work on it in the WICG and then eventually merge it into the IndexedDB standard, which they are one of the editors of). It also has a decent amount of collaboration from various web developers. I'd encourage you to check out the issue tracker and the minutes of the W3C TPAC standards meeting for more!
I don't mean to malign the technical aspects of KV Storage, nor WICG / TPAC / TC39 / etc. collaboration, but rather the specific positioning of KV Storage in the article. There's no acknowledgement of collaboration nor explanation of where this proposal sits in the standards process. In fact, it gives the opposite impression:
- "the first one we're planning to ship"
- "do we have to wait until all browsers support built-in module [...] no!"
- "you can actually deploy your changes today!"
- "Chrome 74+ users won't have to pay any extra download cost"
That reads a lot like an Intent to Ship and counseling developers to begin relying on it, which feels wholly inappropriate given that the entire notion of having built-in modules at all is still a Stage 1 proposal.
Similarly, I do not believe any vendor should claim an in-house implementation of their own proposal as being inherently part of "the Web." It may very well end up that way, but can we at least wait until the proposal hits Stage 3 before using that kind of language?
I think there's some confusion about the standards venue this is taking place in. This work is being done in the WICG, at https://github.com/WICG/kv-storage. The TC39 staging process, while relevant for any built-in modules TC39 may want to work on such as temporal, is not a blocker for web built-in modules.
Just like web standards bodies and TC39 already collaborate on built-in globals, we're also collaborating with TC39 on built-in modules. Thus the links to the stage 1 proposal in the article and explainers. But in the end, KV storage is a web feature, and goes through the web standards process, which doesn't use the Ecma staging process. Instead, it uses the process others are discussing elsewhere on this thread: incubation, shipping to web users through early implementations or origin trials, eventually to stable, and then promotion to a standards body like the W3C or WHATWG. (In this case, to the W3C, as part of the IndexedDB specification.)
Hope this helps!
That's the concern I have; not that it's going through the WICG, but that whatever process it's going through, this blog post sound like Google announcing user-facing shipment of a feature that hasn't finished its standardization process.
We've already been through this before with Web Bluetooth and the Shadow DOM specification. Once Chrome turns a feature on for end users, it is effectively standardized -- it is very difficult to justify changing or evolving a spec once real sites on the actual web have already started to rely on it. Again, look at Shadow DOM as a good example of why this is a problem.
I'd feel more comfortable about this process if there was some clarification that this is an intent to ship only behind a flag, or an intent to ship only to dev/beta versions of Chrome.
I probably should have been clearer in the article. I was trying to strike a balance between:
- presenting what I believe to be a compelling and exciting possible future for the web (especially considering it has a viable polyfill story) - getting developers excited about this future and thinking about how it could integrate with existing tooling
and:
- Asking for feedback on the KV Storage and Import Maps APIs themselves. - Encouraging developer to experiment and/or sign up for the origin trial
It's not an easy balance to strike, and in this case I probably should have emphasized more that this is still in the experimentation phase.
I can update the article to make that more clear.
To be clear, this looks really promising. I particularly like the way that import maps are polyfilled. I kind of wish standard modules were flat-out required to be imported in versioned form, since that would open the door to better API versioning on the web in general, but... whatever, that's what the standards process is for, and it looks like that's something people are at least already talking about.
But the unfortunate side of things is that because of Chrome's history, it's really easy to read posts like this as, "here's a new thing, and btw we're shipping it tomorrow." That's not your fault, it's just what the environment is like right now.
> All your users should benefit from better performance, and Chrome 74+ users won't have to pay any extra download cost.
To me that sounds like, "post Chrome 74, we will have this feature turned on for production sites." If that's not the intent, and Chrome isn't planning to turn this feature on early, then I'm much more excited about the proposal.
> If your site currently uses localStorage, you should try switching to the KV Storage API, and if you sign up for the KV Storage origin trial, you can actually deploy your changes today! All your users should benefit from better performance, and Chrome 74+ users won't have to pay any extra download cost.
I realize that to no small degree that's my own fault for not understanding the specifics of origin trials, but how many people reading this article already understand origin trials?
I don't want to derail things -- I just wanted to get clarification that this wasn't going to be HTML imports again. At the end of the day, I don't care how the announcement is worded as long as it's not actually being shipped in the next release as on by default for every site. The spec itself looks really interesting and I'm excited to see it develop.
There has however been an intent-to-experiment[0] and as the article says it'll be available as an origin trial in Chrome 74. (For those who don't know, origin trials are essentially an per-origin opt-in, time-limited way of shipping. It won't work by default, and in this case it won't work beyond Chrome 76.)
[0]: https://groups.google.com/a/chromium.org/d/msg/blink-dev/sEw...
Intent to experiment is exactly where I would want a feature at this point in development to be -- gives normal people the ability to build things with it and figure out any pain points, but forces them not to use it in a production site quite yet.
> A specification from which at least two independent and interoperable implementations from different code bases have been developed, and for which sufficient successful operational experience has been obtained, may be elevated to the "Draft Standard" level.
Standards are created first by someone implementing them and then others coming out with their own implentation and then finally going through a standardization process
Even IEFTF does not accept standards which lack at least two independent implementations
Once you ship a feature to end users and start advertising it, changing it becomes very, very difficult because you risk breaking the web just by evolving the standard. If you're trying to create a joint standard, you can't start by flipping the switch and turning the feature on for regular people and production-facing sites.
That would be like passing a law and enforcing it months before Congress voted on it, simply because, "without real-world trials, how do we know the law will work?"
I'm mainly and strongly objecting to this degree of external promotion for a Stage 1 proposal, along with positioning it, fait accompli, as part of "the Web."
For the curious, below is a non-exhaustive list of promising tech clearly beneficial to developers and users, killed by Mozilla, on principle rather than technical merit:
1. WebSql - A web port of SqLite - arguably the world's second most used (and loved) tech. Instead, we have IndexedDb, which is such a damn hassle that a million wrappers exist to deal with it's shortcomings and complexity, including the tech presented in this blog post.
2. Nacl/PNacl - A precursor to WebAssembly which already had threads, SIMD, permissions, security ... figured out. By design, most Nacl code will run faster than webassembly, as Nacl's sandbox only excluded certain processor instructions deemed a security threat to it's sand-boxing model
3. HTML5 Storage: A file-system like storage for the browser! Killed by Mozilla...
But let's not kid ourselves: Mozilla hasn't been able to unilaterally kill things for years. We finally caved on H.264 in 2014, acceding to a patent-encumbered Web: https://andreasgal.com/2014/10/14/openh264-now-in-firefox/ The following year, we reluctantly added DRM to Firefox: https://blog.mozilla.org/blog/2015/05/12/update-on-digital-r....
Google was the only vendor that supported NaCl or the Filesystem APIs, and WebSQL similarly failed to gain traction outside of WebKit and Presto. If we were wrong in our assessments of those proposals, we weren't alone. And that's what killed them.
No one wants a monopoly in the browser space, and it seems like Mozilla has some other bone to pick with Google. As stated before, developers and web users come before Mozilla's philosophy, and many of the objections to Google's proposals don't seem to further that mission. Maybe some of it is in Mozilla's self preservation interests, I don't really know. But a lot of Google outrage seems feigned, and contrary to developer and user interest.
If you haven't noticed, most devs here haven't raised any technical objections, instead seem pleased with the offering, that's a hint in itself
My mistake was in assuming that IE dominance was only bad because it wasn't innovating.
What we seem to be developing now is a kind of tunnel vision, where, to your point, we simply assume that Google is the web and the web is Google.
We wouldn't think "Google is the web and the web is Google" if we were seeing a similar string of innovations coming from Firefox and IE.
This will only be bad if the others aren't innovating.
At this point, a Gopher revival is looking pretty enticing to serve content, not lock in, vendor wars or piles of straw stuck together with poo.
It's how the IETF worked with RFCs.
It's usually never been the case that successful standards have been developed whole-cloth by committee and are almost always the result of a single inventors doing 80% of the work, making lots of proposals and shipping experiments to early adopters, and the standards groups refining it before shipping.
A key-value store isn't quite the first module that leaps to mind for such a toolkit :-)
EDIT: found a collection of module proposals! [2]
[1] https://github.com/tc39/proposal-javascript-standard-library
[2] https://github.com/tc39/proposal-javascript-standard-library...
Agreed, although having the implementation defined exclusively by Sqlite (which is why IndexedDB became the standard browser database) remains a rather large sticking point.
Aside from the standards group reverting the deprecation of WebSQL, Firefox adoption has dwindled to dangerous lows, and Microsoft now bases their browser on Chrome, so in the not too distant future one could simply target the dominant browsers, Chrome and Safari, and use WebSQL, deprecated or not (if in 10 years Chrome and Safari haven't removed WebSQL, when will they?).
Unlikely WebSQL will make a comeback though, frontend devs seem to like NoSQL-style structured data, which maps well to JavaScript object notation. Would be great to write the same relational SQL on server and client, but that's a pipe dream unless a drastic shift in standards committe direction happens.
I'd like it to come back but also in a more considered form with some API improvements — exactly the kind of thing you'd get out of it going through the standards process with more than one implementation.
[1] https://github.com/tc39/proposal-javascript-standard-library...
With this mindset I can understand that there might be some reluctance to consider a standard library that would be "set in stone" and shape the language basically forever (and potentially create a burden of legacy feature that needs to be maintained, C++ style).
Why have basic features defined such as namespace, hashing, basic data structures manipulation, and uuid when you can have the unpleasure of rewritting it everytime ?
Why avoid making your users download primitives they have a 100 copies of on their machines in all those dll and so ?
It's not like those are solved problems in all other languages that don't have an accidental monopoly on the Web.
Funny thing is, eventually Google will decide that they do need a standard library and all those freedom fighters will do a 180 flip in terms of what they support. This already happened so many times in the community. (Classes being the most notorious example. I'm not saying Google was behind them, but there was a definite 180 flip on whether classes were needed.)
Maybe this is the first step towards Google establishing a standard library.
W3C and TC39 are constantly publishing new APIs and features. They are pushing the Web towards a single implementation (Chromium). It will become too expensive to have separate implementations.
A new browser will not have to implement kv-storage itself, either it can let the user polyfill it or quite easily copy another browsers implementation.
Polyfills aren't a panacea, and we shouldn't blindly excuse anti-competitive behavior or attempts to monopolize the direction of an otherwise open platform that we all share and depend on.
Now the problem is "Oh no we're converging to a single implementation, we need to diversify it!"
I don't know which is better but it is kind of funny to note.
1. Early IE and netscape era: OMG there are so many browsers
2. IE6 dominance: Oh no we're converging to a single implementation... [and they don't follow the spec]
3. Rise of Firefox and Chrome: "OMG there are so many browsers
4. Chrome dominance: Oh no we're converging to a single implementation... [and they dominate the spec]
We do not have that problem with Chrome.
The core problem remains the same.
Should the only browser be from one company? No.
Was IE6s problem that it was from one company? No.
- Rich text editors
- Drag and drop
- Native data binding and reactive primitives
- Modern SVG support
Etc.
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/Web...
> import { Date } from "std:Date";
> import { Date } from "std:Date+2.1.6-alpha.1";
Which version is the first line going to include? Latest? First?
importmap for backward compatibility / polyfills is very neat though.
I would love to see lowdash/underscore included as a standard library.
why would anyone develop toward a library that doesn't provide those basic guarantees?
there's also no guarantee that your web app gets deployed to an up to date browser, so it's either you can specify which api level your app wants or we're all back to specify which browser version an app runs onto.
Is Google out on another solo raid?
Extra bad because the headline make it sound like a standard.
Or am I missing something?
In the meantime, there are lots of workarounds, such as e.g. creating a script to bridge from built-in modules (which webpack doesn't support) to globals (which webpack does support). E.g. `import { storage } from 'std:kv-storage'; window.kvStorageStorage = storage;` then use `kvStorageStorage` in your webpack code.
Many here hate Microsoft, some probably copy others not knowing what's to hate but the minority that knows the 1990s knows what was so bad, and if they still use anything google then shame be upon them
All vendors implemented (essentially) the same API, then the W3C subsequently abandoned it due to lack of independent implementations [0].
0: en.wikipedia.org/wiki/Web_SQL_Database
Why should there be?