npm start script with babel-node and dotenv - javascript

I have this script which works well
"start": "nodemon -x node -r dotenv/config src/index.js"
I want use babel-node instead node. So there is the new script:
"start": "nodemon -x babel-node --presets=env -r dotenv/config -- src/index.js"
But I get this error
[nodemon] starting `babel-node --presets=env -r dotenv/config src/index.js`
internal/modules/cjs/loader.js:583
throw err;
^
Error: Cannot find module 'pathTo/dotenv/config'
Can you help ?

This worked for me
"start": "nodemon --exec babel-node -r node_modules/dotenv/config index.js"

This issues existed for a short time in babel.
#babel/node cannot seem to resolve node modules, when using --require flag
"start": "nodemon --exec babel-node -r ./node_modules/dotenv/config src/index.js"
This issue has now been resolved.
Allow -r from node_modules with #babel/node
"start": "nodemon --exec babel-node -r dotenv/config src/index.js"

I think that you should check pathTo/dotenv/confit resource path.
I know Babel node bundle file has very strict path rule.

yes,
"start": "nodemon -x babel-node -r node_modules/dotenv/config --presets=env src/index.js"
seems to work
EDIT In fact this definitively does not works

I know this is a reasonably old thread, but here is what worked for me. Full disclosure, I don't really know why this works, but it did. Files condensed for relevancy.
Environment
Windows 10
Node 10.13.0
NPM 6.4.1
Babel 7.2.3
Nodemon 1.18.9
Dotenv 6.2.0
package.json:
{
"scripts": {
"dev": "nodemon src/index.js -- --require node_modules/dotenv/config"
}
}
nodemon.json:
{
"execMap": {
"js": "babel-node --presets #babel/preset-env"
}
}

I use the npm package "env-cmd" for this situation.
"scripts": {
"start": "env-cmd --file ./path/to/.env nodemon --exec babel-node index.js"
}

Related

How to run server only after webpack completes bundling bundles?

"scripts": {
"start": "node server.js",
"build": "webpack"
},
how to run npm run build first and then npm start in a single command?
"scripts": {
"start": "node server.js",
"build": "webpack",
"start-dev" : "npm run build && npm run start"
},
I tried the command npm run start-dev. But only webpack is being compiled. The server isn't running.
I don't know why that doesn't work, but, anyway, you can try this:
"scripts": {
"start": "node server.js",
"build": "webpack",
"start-dev" : "webpack && node server.js"
}
npm i npm-run-all
this package never run into issue. You can add as many as commands
"dev:start": "npm-run-all build start",

nodemon ignore directory

In a Universal Javascript app, I would like nodemon to ignore client directory changes.
I have tried the following:
"devStart": "nodemon server/server.js --ignore 'client/*' --exec babel-node",
"devStart": "nodemon server/server.js --ignore 'client/' --exec babel-node",
"devStart": "nodemon server/server.js --ignore client/ --exec babel-node",
"devStart": "nodemon --ignore 'client/*' server/server.js --exec babel-node",
"devStart": "nodemon --ignore 'client/' server/server.js --exec babel-node",
"devStart": "nodemon --ignore client/ server/server.js --exec babel-node",
None of these work.
File structure:
+-server
+-client
+-package.json <------- where nodemon script is
However this is not working. Pretty sure it is a pattern issue.
Any ideas?
You need to replace .. with ., or just reference client/ directly, also you will need to remove the asterisk:
"devStart": "nodemon --ignore ./client/ --exec babel-node src/server.js"
Or
"devStart": "nodemon --ignore client/ --exec babel-node src/server.js"
According to nodemon docs this is how to ignore a directory via command line:
nodemon --ignore lib/ --ignore tests/
Also note that nodemon will only restart the node process, if you change the npm script you will need to kill the process and re-run npm run devStart
In the very likely circumstance that you're using nodemon in a configuration file, you can create a separate configuration entry for those files to be ignored. Bonus, a cleaner looking nodemon call, especially if files to ignore grows large.
For example, this package.json instructs nodemon to ignore directory test:
{
"scripts": {
"test": "jest",
"start": "nodemon server.js"
},
"nodemonConfig": {
"ignore": ["test/*"]
}
}
Find the complete instructions for nodemon configuration file settings here.
As in the other answer, be sure to restart nodemon for the configuration changes to take effect.
Create nodemon.json in your project root that looks something like this:
{
"ignore": ["db.json"]
}
This is an alternative to using package.json as seen in Andrew Philips answer
See docs
just so you all know, i was using this pattern to exclude directories :
node_modules/**
but it led to using a LOT of watchers: nearly 500000 on one of my projects
and now i use
node_modules/
which uses only 134 watchers.
Always monitor your work
Also you can use something like this to run nodemon only in a specific folder. This way you don't have to add multiple --ignore parameters.
{
"scripts": {
"devStart": "cd ./server/ && nodemon ./server.js"
}
}

How to deploy MERN project using webpack

I use the following project which use webpack
https://github.com/Hashnode/mern-starter
I want to deploy it (to prod) i get error
Error: Cannot find module './dist/manifest.json'
This error is coming from https://github.com/Hashnode/mern-starter/blob/master/index.js
But I dont see the dist folder in the project, why, and how should I build it?
I believe that the Dist folder should be created during the build time (manification etc) so how should I trigger it ?
This is the package.json
{
"name": "mern-starter",
"version": "2.0.0",
"description": "Boilerplate project for building Isomorphic apps using React and Redux",
"scripts": {
"test": "cross-env NODE_ENV=test PORT=8080 MONGO_URL=mongodb://localhost:27017/mern-test node_modules/.bin/nyc node --harmony-proxies node_modules/.bin/ava",
"watch:test": "npm run test -- --watch",
"cover": "nyc npm run test",
"check-coverage": "nyc check-coverage --statements 100 --branches 100 --functions 100 --lines 100",
"start": "cross-env BABEL_DISABLE_CACHE=1 NODE_ENV=development nodemon index.js",
"start:prod": "cross-env NODE_ENV=production node index.js",
"bs": "npm run clean && npm run build && npm run build:server && npm run start:prod",
"build": "cross-env NODE_ENV=production webpack --config webpack.config.prod.js",
"build:server": "cross-env NODE_ENV=production webpack --config webpack.config.server.js",
"clean": "rimraf dist",
"slate": "rimraf node_modules && npm install",
"lint": "eslint client server"
},
I think that the start:prod should trigger it in the webpack but
its not happing ...any idea ?
As per the comments and the documentation:
Building the dist folder is done either via npm run bs or npm run build && npm run build:server (which is what npm run bs executes).
Starting the production build should be done via npm run start:prod (or by copying the commands from the package.json file: cross-env NODE_ENV=production node index.js)

How to use nodemon in npm scripts to build and start scripts?

"scripts": {
"build": "babel src -d lib",
"start": "node --use_strict ./lib/index.js",
"watch": "nodemon lib/index.js --exec npm run build"
}
Using the command npm run watch results in the following wrong command being run: [nodemon] starting "npm lib/index.js run build"
How would I write a nodemon command that, on reload, transpiles the code using babel and reloads the code?
"scripts": {
"build": "babel src -d lib",
"start": "node --use_strict ./lib/index.js",
"watch": "nodemon --exec \"npm run build && node lib/index.js\" -e js --ignore lib/"
}
Then run npm run watch. After this, nodemon will rebuild the project and then restart the server every time source code(.js files) is modified.
--exec specifies what non-node scripts (also works for node scripts as above node lib/index.js) you want nodemon to execute when there is a file change.
-e specifies what file extensions you want nodemon to watch.
--ignore specifies the files/directories you want nodemon to ignore. This option is essential to solve this problem because if you do not specify to ignore this lib/ folder, nodemon will restart infinitely as the compiled files in lib/ are also .js files.
You could simply run your code with babel-node to avoid explicit transpiling.
$ nodemon lib/index.js --exec babel-node --presets=es2015,stage-2
It seems like this is the recommended way to use nodemon with babel.
Please note, running --exec could have unintended side effects when running your development environment remotely of your localhost
You can have two nodemons, one to transpile and the other to run your code. In package.json you can do something like this:
"scripts": {
"serve": "nodemon --watch dist/ ./dist/index.js",
"build" : "nodemon --watch src/ --exec babel ./src --out-dir ./dist --source-maps --copy-files"
},
There is an option to build files with Babel in "watch" mode, let Nodemon monitor just the "build" folder and restart the app upon changes to the compiled output.
{
"name": "app",
"version": "1.0.0",
"private": true,
"dependencies": {},
"devDependencies": {
"#babel/cli": "^7.6.0",
"#babel/core": "^7.6.0",
"#babel/preset-env": "^7.6.0",
"nodemon": "^1.19.2"
},
"scripts": {
"build": "babel src --out-dir build --source-maps=inline --verbose",
"start": "yarn build --watch & sleep 1 && nodemon --watch build build/index.js"
}
}
This example is taken from GraphQL API Examples repository on GitHub.
"scripts": {
"build": "babel src -d lib",
"start": "nodemon --exec babel-node lib/index.js",
"serve": "npm run build && node lib/index.js"
}
Serve is for production, with npm start what you do is transpile first and then run nodemon.
A better option would be to not use a global install but instead use the package installed locally. This will also help for automation builds that might be setup the same as your local machine per 12 factor app design.
"scripts": {
"watch": "node ./node_modules/nodemon/bin/nodemon.js"
}

How do I add a custom script to my package.json file that runs a javascript file?

I want to be able to execute the command script1 in a project directory that will run node script1.js.
script1.js is a file in the same directory. The command needs to be specific to the project directory, meaning that if I send someone else the project folder, they will be able to run the same command.
So far I've tried adding:
"scripts": {
"script1": "node script1.js"
}
to my package.json file but when I try running script1 I get the following output:
zsh: command not found: script1
Does anyone know the steps necessary to add the script mentioned above to the project folder?
*Note: the command can not be added to the bash profile (cannot be a machine specific command)
Please let me know if you need any clarification.
Custom Scripts
npm run-script <custom_script_name>
or
npm run <custom_script_name>
In your example, you would want to run npm run-script script1 or npm run script1.
See https://docs.npmjs.com/cli/run-script
Lifecycle Scripts
Node also allows you to run custom scripts for certain lifecycle events, like after npm install is run. These can be found here.
For example:
"scripts": {
"postinstall": "electron-rebuild",
},
This would run electron-rebuild after a npm install command.
I have created the following, and it's working on my system. Please try this:
package.json:
{
"name": "test app",
"version": "1.0.0",
"scripts": {
"start": "node script1.js"
}
}
script1.js:
console.log('testing')
From your command line run the following command:
npm start
Additional use case
My package.json file has generally the following scripts, which enable me to watch my files for typescript, sass compilations and running a server as well.
"scripts": {
"start": "concurrently \"sass --watch ./style/sass:./style/css\" \"npm run tsc:w\" \"npm run lite\" ",
"tsc": "tsc",
"tsc:w": "tsc -w",
"lite": "lite-server",
"typings": "typings",
"postinstall": "typings install"
}
Steps are below:
In package.json add:
"bin":{
"script1": "bin/script1.js"
}
Create a bin folder in the project directory and add file runScript1.js with the code:
#! /usr/bin/env node
var shell = require("shelljs");
shell.exec("node step1script.js");
Run npm install shelljs in terminal
Run npm link in terminal
From terminal you can now run script1 which will run node script1.js
Reference: http://blog.npmjs.org/post/118810260230/building-a-simple-command-line-tool-with-npm
Lets say in scripts you want to run 2 commands with a single command:
"scripts":{
"start":"any command",
"singleCommandToRunTwoCommand":"some command here && npm start"
}
Now go to your terminal and run there npm run singleCommandToRunTwoCommand.
Suppose I have this line of scripts in my "package.json"
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"export_advertisements": "node export.js advertisements",
"export_homedata": "node export.js homedata",
"export_customdata": "node export.js customdata",
"export_rooms": "node export.js rooms"
},
Now to run the script "export_advertisements", I will simply go to the terminal and type
npm run export_advertisements
Example:
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build --prod",
"build_c": "ng build --prod && del \"../../server/front-end/*.*\" /s /q & xcopy /s dist \"../../server/front-end\"",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
As you can see, the script "build_c" is building the angular application, then deletes all old files from a directory, then finally copies the result build files.

Categories

Resources