Home » Nodejs » Use of @ symbol in Node module names

Use of @ symbol in Node module names

Posted by: admin November 29, 2017 Leave a comment

Questions:

I’m looking at some code from a coworker wrote and she’s using the @ symbol in require statements. This is the first line of one of these files:

var restServer = require('@company/config')

When I try to run this code, I get an error:

Error: Cannot find module '@company/config'

Which I frankly expect, there’s nothing that looks like this in my directory for require to recognize! It seems like there’s some magic going on here, which I hate.

All I can guess is that either this is some obscure npm or Node trick that I haven’t been exposed to, or maybe that there’s some other dark art of configuration that I’m not getting. Any info appreciated, even if it’s just an explanation of how @ works with require.

Other ideas: Chef is involved somewhere in this whole thing, so that might be relevant.

Update: 99% certain this is an issue with the way npm config works at this point, but still unsure of how to go about fixing it.

Update2 based on some stuff I uncovered:

Dereks-MacBook-Pro:project-dir derekjanni$ npm config set //registry.npmjs.org/:authtoken $SECRET_TOKEN

Dereks-MacBook-Pro:project-dir derekjanni$ npm install
npm ERR! Darwin 15.0.0
npm ERR! argv "/usr/local/Cellar/node/5.5.0/bin/node" "/usr/local/bin/npm" "install"
npm ERR! node v5.5.0
npm ERR! npm  v3.5.3
npm ERR! code E404
npm ERR! 404 Not found : @company/config
npm ERR! 404  '@company/config' is not in the npm registry.
Answers:

Scoped packages in npm are preceded by an ‘@’ symbol: https://docs.npmjs.com/misc/scope

The docs include additional information on requiring scoped packages:
https://docs.npmjs.com/misc/scope#requiring-scoped-packages

Requiring scoped packages

Because scoped packages are installed into a scope folder, you have to
include the name of the scope when requiring them in your code, e.g.

require('@myorg/mypackage')

There is nothing special about the way Node treats scope folders, this
is just specifying to require the module mypackage in the folder
called @myorg.

Questions:
Answers:

So I solved this one myself.

Turns out @company/config is one of our private NPM repositories, hosted on npm and defined by this alias to an internal GitHub repository: it had nothing to do with how require works.

Using @ may or may not be a protocol that I was unaware of for private NPM repos, keep that in mind if you run into this.

Questions:
Answers:

When you call require() it reads a route. Since there seems to be no problem if you name a folder as @company, you should be able to require something with an @.

Your coworker may have wanted to keep @company/config.js for herself because configurations usually are personal and could not be the same for another user.

require will call files inside your project folder, with a detail:

  • If you call files inside your project folders you must add ./ in front of your route.
  • If you call any global package such as http or any npm modules (which are installed at node_modules), you can omit the ./.

I created a route @company/config inside my test project folder. It only allowed me to require it using ./@company/config. Only when i moved the folder inside node_modules, it allowed me to require('@company/config');.

I wouldn’t recommend to put any module inside node_modules, it’s just a ‘container’ for npm packages. Try to create a new config file and change the require route or simply delete the require and create a config object in your main file.