Why I write plain JavaScript modules
ponyfoo.com
ponyfoo.com
Doesn't npm manage transitive dependencies, just like Maven in Java-land? I sure thought it did. Are package maintainers just not getting their dependencies right? E.g. - "everybody" uses jQuery, it will just be there, I'm not going to list it.
I have only used Node/NPM a little bit at home. Most of my JS work has been some things embedded within larger Java web apps, and my coworkers don't really like JS (they are wanting to do static-OOP where dynamic-FP fits better).
This is not true in npm v3: it now flattens the dependency tree and only duplicate dependencies if there are incompatible versions required.[1] Granted, if those four packages all depended on jQuery locked to different specific versions, then you would end up with four nested versions of jQuery.
There is a small problem and a big problem with this. The small problem, is that your build size will be unreasonably large. The big problem, is that this React library has internal state - you can't just initialise multiple copies of it, and expect them to share a single state.
Enter peer dependencies. Each library that needs React, demands that the root module, your application, specify a normal depency on React, that satisfies their version range requirements. Clearly, this quickly becomes impossible. So, version mismatch is treated as a warning, not an error, and you (the application developer) learn to basically ignore that warning.
I can think of lots of solutions to this problem, all of which have problems of their own.
- All libraries factor out their state, so that they are stateless. Now you can load multiple instances of a module, but if they have different major versions, then they are totally going to mess up that state that you are holding for them.
- Application developer: it is your responsibility to patch your dependencies, and their dependencies, so that they all accept an overlapping range of React versions. But who has time to test 30 modules for regressions?
- Just build more, smaller, simpler applications. This is where I am right now. I still get version warnings, but it is a little less risky to ignore them.
How do you handle this issue in the Java community?
* Small, sharp tools (sometimes) - things like Google Guava "collections" utilities, or the Ostermiller CSV file handling library, which have very small and stable scope.
* Big collections of things, such as Spring or Struts. Regardless of how you feel about these libraries, they do tend to come as a family of interrelated libraries (supplemental components) that get released in lock-step and play nice together.
I dislike the Java language, but I guess it is nice that most of the stuff on Maven Central does tend to be stable.
Javascript, a la Web 2.0, has really only been a serious development thing for about 10 years. It's due for its own settling in period soon, I would imagine.
It does - actually the pain that I'm expressing is the same pain I felt with Maven: somebody comes along and says, "Oh, you're doing OAuth? You should definitely use an OAuth library for that." So I pull in the OAuth library and let either mvn or npm pull in all of the transitive dependencies, half of which I've never heard of and the other half I know, but am not an expert in. Which is a problem when one of them reports an error message like "Unrecognized parameter in dozer mapping". What? What parameter? What mapping? WTF is 'dozer'? I google the error message and get a hundred hits, none of which have anything to do with my case. So now I'm going through a poorly documented transitive dependency trying to figure out a) what it does b) how it does it and c) why it broke my OAuth implementation (all with the boss standing behind me, checking his watch, tapping his foot impatiently, wondering why this is taking so long when I'm reusing something that's supposed to make this all magically work instantaneously). I'm suddenly loading somebody else's source code in a debugger, trying to figure out where it gets all its configuration data, thinking "would it _really_ take that much longer to write my own OAuth.... (or date picker or JSON parser or whatever else is misbehaving)"
If you want the small stdlib with small module approach, you need a language and runtime system with some better static guarantees.
It seems odd to bring up Java here, but this is one of the problems solved (not without cost) by checked exceptions.
By making the types of exceptions explicit, each layer is encouraged to reframe (or wrap) the errors from its dependencies in a way which matches its own usage and level of abstraction.
Secondly, if you tout "React integration" people are going to want a Draggable component or mixin/HOC or whatever. Making people do things in `componentDidMount` isn't really integration.
That said: yes, it's a good idea to base your framework-specific integration on top of a generic battle-tested library. This however appears to be a bad example of that.
Libraries that set a lot of native key handlers can also be problematic. Native browser key events are a pain to mock, and the same mocking techniques are not available in all browsers. If you want to unit test in all browsers, you have to write some truly hideous tests.
The fact is that a lot of browser API's are terrible, and tools like jquery can help smooth over browser differences and make it easier to test your code that relies on a library.
One approach is to have a library that you call instead of the native addEventListener, setTimeout, etc. method.
Another is to use something like zones.js which does this for basically ever async API in the browser, and then use test utilities that let you play with time, like flushing all timers, or advancing time by specific amounts.
// given a context and function 'func'
var args = [];
for(var i = 0; i < arguments.length; i++){
args[i] = arguments[i];
}
func.apply(context, args);
Source: https://github.com/petkaantonov/bluebird/wiki/Optimization-k...Even if it were okay, it's an absurd dependency.
let argArray = (...args) => doStuffWithArgArray(...args)Here are some of my successful pure JS modules:
https://github.com/mohsen1/json-formatter-js https://github.com/mohsen1/json-schema-view-js
If you want to use those modules in any framework you just wrap it in a tiny thin wrapper and I don't have to keep up with framework changes and all that...
Is that a typo? Did you mean "not" or "now"?
Most frameworks have a specific way of rendering the DOM.
In React, manually altering the DOM is an anti-pattern. Even more so if you are using a global store like Redux and/or functional components.
Integrating other "classic" UI code into React is almost always very hackish.
It's nice for some tasks, sure, but it also feels like a big hack.
Finding the difference between a list of 10,000 items is absurd. This is where I believe React will find its replacement or forced to adapt to.
it's great compared to the alternatives in the browser today, but it seems extremely wasteful compared to an unbound universe of alternatives.
But UI level stuff, probably should be done in your framework. So Business logic drives state, which your framework translates into DOM.
I do appreciate little utility libraries like Ramdajs and Validatejs, though.
This article was a nice reminder to make the attempt to decouple small plugins, though. I like the idea of the base module + alternate framework adapters.
let nodes = Array.from(document.querySelectorAll('.item'));
nodes.forEach(node => console.log(node));
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe... var classNames = [].map.call(nodeList, (entry) => entry.className)
The 'call' function in java script allows you to specify the "this" in the calling of the function. So we grab the map function from an empty array, and call it with nodeList as "this". You can find out more here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...You could also use that to make a super simple method to allow you to call map on any array like object, then you can import this into your other files:
function map(arr, callback) {
return Array.prototype.map.call(arr, callback);
}
Then call it like var classNames = map(nodeList, (node) => node.className);Also, everyone loves to hate the DOM. It's so "low level."
Additionally, I feel Google tainted the idea of them by making Polymer the face of the standard, rather than letting it stand by itself.
How about not targeting a specific language either?