I'm facing the problem of integrating requirejs with d3 and nvd3, and i found an easy solution using require's shim. Using the shim i can export a variable, and i can also define dependencies:
d3: { exports: 'd3' },
nvd3: {
exports: 'nv',
deps: ['d3']
},
In this way, i simply install d3 and other packages with bower, and include them with require, and it is really quick and clean.
Nonetheless, i faced the following problem: there are probably some clashes between the global d3 variable and the local one (the one injected in the requiring modules). It is a d3 / require / nvd3 integration problem related to transitions and selections. I don't fully understand the problem, but i can already make some considerations.
- jquery has the same problem with require, and they provide the noconflict method to fix it
- many libraries have this behavior, they export a global symbol, but as far as i know there is no ready fix from requirejs for the general problem
- the problem is fixed if i rename all global references to
d3
into d3 source to another name. I still haved3
in the injected module, but it is not conflicting anymore
As far as i can see, all d3 functionalities work this way, but one of the nvd3 charts has transitions broken probably because a selection or dispatcher is overwritten. It requires deep understanding of d3 internals to spot precisely the error, but probably a simple yet correct handling of the global symbol will clear the whole tally of similar problems.
Probably, due to the way requirejs handles shim dependencies, the global d3 symbol is exposed to nvd3. The same symbol, anyway, is not available to requiring modules, and will be overwritten somehow if injected (included in the module dependencies).
I tried also to wrap d3 in a module and properly return a local d3 variable, but looks like the problem still persists.
I also asked help about this on this d3 group discussion which hosts some previous posts about d3 and modules.
I added a test case here: https://github.com/danse/requirenvd3