I'm currently playing around with React Native. I'm trying to structure my app, however it's starting to get messy with imports.
--app/
-- /components
-- Loading.js
-- index.ios.js
Now, within my index.ios.js
i'm able to simply do:
import Loading from './components/Loading';
However, when I start to create more components, with a deeper directory struture, it starts to get messy:
import Loading from '.../../../../components/Loading';
I understand the preferred solution would be to make private npm modules for things, but that's overkill for a small project.
You could do a global.requireRoot
type solution on the browser, but how do I implement this with import?
In Webpack 3 the config is slightly diffrent:
...
If you're using Create-React-App, you just need to change the environmental variable NODE_PATH to contain the root of your project.
In your config.json do the following change to set this variable before running the react-scripts commands:
We're using the npm library cross-env because it works on unix and windows. The syntax is
cross-env var=value command
.Now instead of
import module from '../../my/module'
we can doimport module from 'src/my/module'
Extra details on implementation
Its important to note that cross-env's scope is limited to the command it executes, so
cross-env var=val command1 && command2
will only have var set during command1. Fix this if needed by doingcross-env var=val command1 && cross-env var=val command2
create-react-app gives precedence to folders in node_modules/ over whats in NODE_PATH, which is why we're setting NODE_PATH to "." instead of "./src". Using "." requires all absolute imports to start with "src/" which means there should never be a name conflict, unless you're using some node_module called src.
(Note of caution: The solution described above replaces the variable NODE_PATH. Ideally we would append to it if it already exists. NODE_PATH is a ":" or ";" separated list of paths, depending on if its unix or windows. If anyone finds a cross-platform solution to do this, I can edit my answer.)
If you are using Webpack you can configure it via the resolve property to resolve a your import path.
Webpack 1
Webpack 2
After that you can use
instead of the:
Webpack will configure your import path from the passed resolve param.
The same stuff you can do with System.js loader but with it's own config param (it's can be map or path. Check it in the System.js documentation) (if you would like to use it. It's mostly for a Angular 2 case. But I suggest: don't use standard System.js even if you are working with ng2. Webpack is much better).
I just checked out a React project which is more than 6 months old and for some reasons my imports no longer worked. I tried the first answer:
Unfortunately this did not work.
I added an
.env
file in the root of my project at the same level as mypackage.json
. I added the following line to that file and this fixed my imports in my project.Had the same issue with React. So i wrote some plugin for babel which make it possible to import the modules from the root perspective - the paths are not shorter - but it's clear what you import.
So instead of:
You can use:
Here is the Plugin (tested and with a clear README)
With webpack you can also make paths starting with for example
~
resolve to the root, so you can useimport Loading from '~/components/Loading';
:The trick is using the javascript bracket syntax to assign the property.