Hacker Newsnew | past | comments | ask | show | jobs | submit | more zelly's commentslogin

I wanted to make something like this, but using Bluetooth LE. Then I looked at the Bluetooth spec and implementations realized why Bluetooth applications are so unreliable (other than Apple device to Apple device). It’s really hard. Plus every OS has their own incompatible API, with some parts missing or inaccessible for some reason.

The practical solution to “share files in physical proximity” ends up being just use Apple everything.


No. It’s dead, Jim. (That said, it’s better than Python by miles, but it suffers from the same curse as Lisp.)


So when do we get the worldwide 0-day caused by a malicious crates package?


The Kernel and say Chromium, don't use crates.io. They (will) vendor what they need, which they can update when they need to and when they've reviewed the dependencies.

Unless that 0-day comes from some other software, it seems unlikely that we'll get such a worldwide supply chain issue.


Firefox, on the other hand, seems to download a ton of Rust packages during the build as opposed to vendoring. (Debian maintains a bunch of hacks to allow vendoring all the Rust components, but this isn't the default or the approach taken by other distros, e.g. Arch Linux.)


No, Firefox vendors everything it uses. Debian has no patches wrt vendoring of Rust code in Firefox. Source: I work for Mozilla and maintain the Debian Firefox package.


Thank you, I appreciate the correction. Did this change at some point in the past? I seem to remember the Arch Linux package downloading a ton of Rust stuff at one point.


No, it has always used vendored crates. Well, technically, it wasn't using vendored crates until https://bugzilla.mozilla.org/show_bug.cgi?id=1298422 , but before that, there were only a limited number of crates in use, and their only dependencies were local, so practically, that's the same thing.


It seems people still have not grasped free software. You could have full control over your computing experience, limited only by your abilities.


AI in those days was completely academic, so they used the in vogue academic language. It was a tribal thing—the same way HN gets excited when they see Rust. AI in the 1980s was centered around MIT, where everyone knew Lisp (actually Scheme) from the famous SICP course.


Correct. The best use case for Web Components is to ship a bloat-free, reusable widget that doesn't care whether a consumer uses it with React, Vue, vanilla JS, Angular, etc.


RxJS aka the reason so many websites take 100MB of memory nowadays

Don't use it


It fairness you can do reactive data without RxJS. For example by using the vanilla web socket API. Agree that RxJS is best avoided though.


You can react to state changes with an astonishingly small amount of code with JS [0]

[0]: https://github.com/curlywurlycraig/vdom-util/blob/master/src...


Link doesn't work for me. 404s


Apologies, should be good now.


I got into RxJS cause I had to deal with an Angular project a few months ago, what's wrong with it?


The problem with Web Components is it's slower than React or other vDOM implementations. Also everything is a string. To re-render, you have to manipulate the innerHTML--usually replacing the string every update. To pass a prop to a component in a modular way, you have to pass a string attribute (e.g. something like <my-component my-attribute="[1,2,3]"/>). Even though v8 is extremely fast at string operations, it's just not a good practice and doesn't scale.

W3C standardized Web Components before React existed and took off, unfortunately. I expect the next standard to just be React itself (or a barebones version that the library can build on top of), patent licenses permitting. I'm pretty sure as a C++ precompile, it would be unstoppable and end the debate for good.


Every real world use of Web Components that I’ve seen uses <template> elements and/or imperative DOM methods to implement rerendering. These are blazing fast and exactly what React uses. It’s possible to build a slow app using Web Components, but that’s true of every library, including React.


Same here; I suspect they've mixed up defining the component (where some examples do use innerHTML) and using the component (which don't).


> Web Components is it's slower than React or other vDOM implementations

> To re-render, you have to manipulate the innerHTML--usually replacing the string every update

"Usually" is relative, I guess, but nothing's stopping you from using the imperative DOM APIs to update the component's contents; I daresay this would be the typical thing to do. These APIs will be just as performant as anything else out there. What you're really giving up, then, is the reactive programming model. Web Components are just a way of modularizing things; they have nothing to say about how you update the DOM (for better and worse).

You are right (I think) that there's no good way around converting attributes to and from strings, though the performance overhead there should be minuscule in most cases. The bigger problems with that are a) some data (like functions) can't be serialized at all, and b) it leaves a lot of room for passing invalid values


You can use DOM node properties instead of attributes, when working with custom elements from JS. No seraialization/deserialization to/from string there.


If you're using a framework like lit-html as the author recommends, it will replace the string every update. Most people will prefer that way since it's more ergonomic and similar to React. You could do imperative DOM updates, but that'd be like going back in time to jQuery.


This is false. It does not replace the entire string, but uses a template literal to identify which changes need to be made before selectively updating the DOM.

This video is a few years old, but the core concepts remain the same.

https://m.youtube.com/watch?v=Io6JjgckHbg


Wow, that's a pretty compelling video. I guess they all are, but I like the use of modern web standards.


This simply isn't true. Tagged template literals are not string concatenation. Also any "thin layer" of tooling on top of vanilla web components (like Lit) is entirely capable of passing complex objects as props. String-only "props" are only the case for literal HTML attributes in your source HTML—and even then you can embed JSON in an attribute and get a real parsed object within the component.


> Tagged template literals are not string concatenation

They are not concatenation by themselves. But for them to be useful, you will end up doing a lot of it because there's nothing else to do with strings than parse (often with regexps [1]) and concatenate [2] the strings. And then you dump the concatenated string into the DOM using `.innerHtml` [3]

There's no magic.

[1] https://github.com/lit/lit/blob/main/packages/lit-html/src/l...

[2] https://github.com/lit/lit/blob/main/packages/lit-html/src/l... and https://github.com/lit/lit/blob/main/packages/lit-html/src/l... and so on.

[3] https://github.com/lit/lit/blob/main/packages/lit-html/src/l...


I use Lit every day and I have no idea what you're talking about.

Any property can be a full JS object. When the property is changed, it is re-rendered in your component. I have never touched innerHtml and my Lit apps pass and render all kinds of stuff into html`` tagged templates.

It's really pure magic because you can freely mix regular old HTML and regular attributes with dynamic data and data binding. There's more than one way to write anything which gives you great flexibility. I adore tagged templates, and they work for CSS and SVG, too.


> I use Lit every day and I have no idea what you're talking about.

I'm talking about how lit is implemented internally and that's why I provided links to relevant parts of lit's code.

People having no idea how things work is the bane of our industry. And that's why we have objectively false statements like "regular old HTML and regular attributes with dynamic data and data binding".

Lit is almost as far from "regular old HTML" as React's JSX is: lit is a HTML-like DSL that even has constraints on how you use tagged literals themselves.

E.g. `<${tagName}></${tagName}>` is a valid tagged literal and it's invalid in lit.[1]

> they work for CSS and SVG, too.

If lit lets you mix SVG with custom elements, they don't really use custom elements. See discussion https://twitter.com/Rich_Harris/status/1198339672361119745?s...

[1] https://lit.dev/docs/templates/expressions/#invalid-location...


I do understand that string concatenation and DOM rewrites are happening under the hood. How could they not be? But the point of using an abstraction like Lit is that I don't have to worry about that part.

Are you suggesting that Lit is updating .innerHtml when it doesn't need to? And are you sure about that? Because that should be entirely under my control by setting properties or state of the component, not by Lit redrawing them willy-nilly.


> Are you suggesting that Lit is updating .innerHtml when it doesn't need to?

Literally nowhere did I say that. I was responding to a specific thing.


So what exactly is the complaint? You said that tagged templates require needless updates to .innerHtml and that "string concatenation" is the only thing they can do. Now we are agreeing that that's not true? :-)

How is it "objectively false" that Lit mixes regular HTML with data binding? That is exactly how it works. I have several Lit apps and they use regular HTML as well as custom components and both have access to Lit properties and state that are dynamic.

Are we talking at cross-purposes or are we trying to say the same thing two different ways? I use this tech every day and I feel like you're saying something about it that's not true -- or maybe I'm not understanding your view.


> You said that tagged templates require needless updates

I never said needless

> that "string concatenation" is the only thing they can do

It's not what "they" need to do. It's what you, or the library using them needs to do.

> Now we are agreeing that that's not true

If you invent something that I never said, then yes, we can both agree it's not true.

> How is it "objectively false" that Lit mixes regular HTML with data binding?

Once again that is not what I said. The objectively false statement is that it's "regular HTML". Lit is a HTML-like DSL because none of this is "regular HTML" because those attributes are invalid in regular HTML:

   html`<div ?hidden=${!show}></div>`

   html`<input .value=${value}>`

   html`<button @click=${this._clickHandler}>Go</button>`
And, on top of that it even adds constraints to tagged literals themselves:

   // Valid JS, and valid tagged literals. Invalid Lit

   <${tagName}></${tagName}>

> Are we talking at cross-purposes or are we trying to say the same thing two different ways

No. You're inventing things that I never said or implied and arguing against those inventions.


I still don't understand the objection. Your example of invalid Lit is something I would never write. Lit is perfectly helpful without it. What makes you say the .value and @click attributes are invalid? In some older HTML spec, you mean? They certainly work correctly in modern browsers.

You can definitely mix data binding with regular HTML. It might be "invalid" according to a spec that makes no difference. The point of all of this is to write apps that work and can be debugged.

What is the rallying cry against Lit, exactly?


> I still don't understand the objection.

Please re-read what I wrote in my very first comment

> What makes you say the .value and @click attributes are invalid?

Just checked the spec, you're right they are valid. Hm, I was sure they weren't. Won't dig through the history to see if this changed :)

However, "Authors must not use elements, attributes, or attribute values that are not permitted by this specification or other applicable specifications, as doing so makes it significantly harder for the language to be extended in the future.", https://html.spec.whatwg.org/multipage/dom.html#elements

So I'd say they are still not okay on existing HTML elements

> It might be "invalid" according to a spec that makes no difference.

That is a very bad stance to take. "Invalid to the spec, but who cares".

> What is the rallying cry against Lit, exactly?

There's no rallying cry against lit. Stop. Inventing. Words. And. Meanings. I. Never. Said. Or. Implied.

There's a single very literal comment I made with links to support that statement.

I'm out of this discussion. I have other things to do with my life than keep saying "I never said what you think I said" over, and over, and over again.


Right, all I'm saying is this is nothing intrinsic to the Web Components standard like the parent comment suggested. It's just one particular way you might use them.


> To pass a prop to a component in a modular way, you have to pass a string attribute

Is this actually how people pass props with Web Components? I've only used web components for a few years but I've always created a new instance of the class and I pass props using the constructor like:

`${new ExampleComponent(props)}`

Then in the constructor it's just this.state = {...this.state, ...props}


I’m not sure what you’re referring to here honestly but React is substantially behind web components in terms of every performance metric I can think of.

Boot up, runtime, micro benchmarks and at scale.


This is neat but for convenience not performance. The bottleneck is in the kernel more than anything else. Probably it has the same latency as nginx, modulo safety checks. I would also recommend uWebSockets for an easy-to-embed web server.


Nah Rust evangelism is pretty organic. I remember it having a cult 6 years ago too, before any of these companies got involved.


> Rust evangelism is pretty organic

I'm sure it was. But it's six years on, and companies have gotten involved. They now have a financial stake. It would be naive to think that evangelism is still genuine grass roots, in the same way that it's naive to think the stuff on your FB feed reflects what your friends find interesting and worth sharing.


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: