Suggestions? Importing JavaScript objects into .hooks.js files (Surface UI)

Recently I have started using Surface UI. The ability to colocate my view/component and its hooks has helped me organize my project better.

AppWeb/Live
|_________ aardvark.ex
|_________ aardvark.sface
|_________ aardvark.hooks.js
|_________ baboon.ex
|_________ baboon.sface
|_________ baboon.hooks.js

I like to keep my .hooks.js files nice and tidy, though. So I would like to be able to import objects from other .js files. For example, by providing the relative path of the .js file (relative to the .hooks.js file). Or by colocation. In the latter case you’d get:

AppWeb/Live
|_________ aardvark.ex
|_________ aardvark.sface
|_________ aardvark.hooks.js
|_________ aardvark.js
|_________ baboon.ex
|_________ baboon.sface
|_________ baboon.hooks.js
|_________ baboon.js

Any advice how to go about implementing this? I will also dive into the code base of Surface to see if I can borrow any solutions from there, but I could use some help looking for a solution in the right direction.

Thank you.

1 Like

I kept my JS files inside assets/js folder and imported them from my hooks components as if that existed inside hooks folder.

Here is an example:

Notice the location of the hooks.js (colocated) file as opposed to their JS imports (assets/js)

I’ve been doing that, but have been thinking about improving code organization beyond that (I should have been more explicit about that).

Some of the options that came to mind:

  1. Allow colocated .js files. This has the disadvantage that you can only colocate one .js file besides the .hooks.js file.
  2. Define .js import paths relative to the .hooks.js file. Possibly indicated with a symbol (e.g. €). For example:
// this is inside a .hooks.js file
import { example } from 'app.js' // Path relative to assets folder
import { eagle } from '€/animals.js' // Path relative to .hooks.js file

Using € might be a terrible choice, but just for argument’s sake.

  1. Both. Allowing colocation AND path relative to .hooks.js.

I think it would work nicely if I can organize my code as follows, if there is a large amount of lines of code:

AppWeb/Live
|_________ helpers (folder)
|_________ aardvark.ex
|_________ aardvark.sface
|_________ aardvark.css
|_________ aardvark.hooks.js
|_________ aardvark.js

But also being able to use fewer files, if there aren’t as many lines of code.

AppWeb/Live
|_________ helpers (folder)
|_________ aardvark.ex
|_________ aardvark.hooks.js

I’m anticipating the maintenance of large projects. That’s why I’m interested in this topic atm.

By the way, I’m not trying to imply putting all files at the top level of AppWeb/Live, that’s also for argument’s sake only.