site/docs/core/development.md
We provide convenient ways for development, debugging, and unit tests to improve your development experience.
Here, we need to use egg-bin module (Only used in local development and unit tests. For production environment, please refer to Deployment).
First of all, we need to include egg-bin module in devDependencies:
$ npm i egg-bin --save-dev
Once we have modified code and saved in local development, the app will restart automatically, and our changes will take place right after that.
Add npm scripts into package.json:
{
"scripts": {
"dev": "egg-bin dev"
}
}
And then we may start app by npm run dev.
To start app in local, environment needs to be set as env: local. The configuration comes from the combination of both config.local.js and config.default.js.
Note: The local development environment relies on '@eggjs/development' module, enabled by default, and closed other environment, Configuration reference config/config.default.ts
ReloadUnder the following directory (including subdirectories) will watch file changes under development environment by default, trigger an Egg development environment server reload:
set
config.development.overrideDefaulttotrueto skip defaults merge.
Under the following directory (including subdirectories) will ignore file changes under development environment by default:
set
config.development.overrideIgnoretotrueto skip defaults merge.
Starting app in local will listen to port 7001 by default. You may assign other port to it like this:
{
"scripts": {
"dev": "egg-bin dev --port 7001"
}
}
Here we mainly cover the usage of the tools, for more details about unit tests, please refer to here.
Add npm scripts into package.json:
{
"scripts": {
"test": "egg-bin test"
}
}
And then we can run unit test by npm test.
To run test cases, environment needs to be set as env: unittest. The configuration comes from the combination of both config.local.js and config.unittest.js.
npm test command will look for all the files ended with .test.js under test folder (default glob matching rule is test/**/*.test.js).
However, we would like to run only the test cases that we are working on sometimes. In this case, we may specify a file in the following way:
$ TESTS=test/x.test.js npm test
glob expressions are supported here.
Mocha supports various reporters. Default reporter is spec.
Reporter is allowed to be specified mannually via setting TEST_REPORTER as the environment variable. For example, to use dot instead:
$ TEST_REPORTER=dot npm test
The default timeout is 30 seconds. We may set our own timeout (in milliseconds). For example, setting timeout to 5 seconds:
$ TEST_TIMEOUT=5000 npm test
Besides environment variables, egg-bin test also supports passing parameters directly, and it supports all mocha parameters. You may refer to mocha usage.
$ # Passing parameters via npm need to add an extra `--`, according to https://docs.npmjs.com/cli/run-script
$ npm test -- --help
$
$ # Equivalent to `TESTS=test/**/test.js npm test`. Since the limitation of bash, it's better to add double qoute to path.
$ npm test "test/**/test.js"
$
$ # Equivalent to `TEST_REPORTER=dot npm test`
$ npm test -- --reporter=dot
$
$ # Parameters of mocha are supported, such as grep, require, etc.
$ npm test -- -t 30000 --grep="should GET"
egg-bin has build-in nyc to support calculating code coverage report of unit test.
Add npm scripts into package.json:
{
"scripts": {
"cov": "egg-bin cov"
}
}
And then we can get code coverage report of unit test via npm run cov.
$ egg-bin cov
test/controller/home.test.js
GET /
✓ should status 200 and get the body
POST /post
✓ should status 200 and get the request body
...
16 passing (1s)
=============================== Coverage summary ===============================
Statements : 100% ( 41/41 )
Branches : 87.5% ( 7/8 )
Functions : 100% ( 10/10 )
Lines : 100% ( 41/41 )
================================================================================
And we may open HTML file of complete code coverage report via open coverage/lcov-report/index.html.
Just like test, the environment needs to be set to env:unittest to run cov, and the configuration comes from the combination of both config.local.js and config.unittest.js.
To ignore some files in code coverage rate calculation, You may use COV_EXCLUDES as the environment variable to ignore some specific files that don't need the test converages:
$ COV_EXCLUDES=app/plugins/c* npm run cov
$ # Or pass this setting via parameters
$ npm run cov -- --x=app/plugins/c*
Logger ModuleThere's a built-in Log in the egg, so you may use logger.debug() to print out debug information. We recommend you use it in your own code.
// controller
this.logger.debug('current user: %j', this.user);
// service
this.ctx.logger.debug('debug info from service');
// app/init.js
app.logger.debug('app init');
Levels of logs can be configured via config.logger.level for printing into file, and config.logger.consoleLevel for printing into console.
Debug Moduledebug module is a debug tool widely adopted in Node.js community, plenty of modules are using it to print debug information. So for the Egg community. We recommand you use it in your own development of framework and plugins.
It's easy for us to watch the whole process of test through DEBUG as the environment variable to start with certain code.
(Do not confuse debug module with logger module, for the latter also has quite a lot of functions, what we mean "log" here is the debug info.)
Turn on log of all modules:
$ DEBUG=* npm run dev
Turn on log of specific module:
$ DEBUG=egg* npm run dev
Detail logs of unit tests progress are able to be viewed via DEBUG=* npm test.
egg-binAdd npm scripts into package.json:
{
"scripts": {
"debug": "egg-bin debug"
}
}
And then we may set breakpoints for debugging our app via npm run debug.
egg-bin will select debug protocol automatically. Inspector Protocol will be selected for version 8.x and later. For earlier ones, Legacy Protocol is the choice.
Meanwhile, It also supports customized debug parameters.
$ egg-bin debug --inpsect=9229
master is 9229 or 5858 (Legacy Protocol).agent is fixed to 5800, it is customizable via process.env.EGG_AGENT_DEBUG_PORT.worker will increase from master port number.App starts by env: local when executing debug . The configuration comes from the combination of both config.local.js and config.unittest.js.
The latest DevTools only supports Inspector Protocol. Thus you will need to install Node.js 8.x or higher verions to be able to use it.
Execute npm run debug to start it:
➜ showcase git:(master) ✗ npm run debug
> [email protected] debug /Users/tz/Workspaces/eggjs/test/showcase
> egg-bin debug
Debugger listening on ws://127.0.0.1:9229/f8258ca6-d5ac-467d-bbb1-03f59bcce85b
For help see https://nodejs.org/en/docs/inspector
2017-09-14 16:01:35,990 INFO 39940 [master] egg version 1.8.0
Debugger listening on ws://127.0.0.1:5800/bfe1bf6a-2be5-4568-ac7d-69935e0867fa
For help see https://nodejs.org/en/docs/inspector
2017-09-14 16:01:36,432 INFO 39940 [master] agent_worker#1:39941 started (434ms)
Debugger listening on ws://127.0.0.1:9230/2fcf4208-4571-4968-9da0-0863ab9f98ae
For help see https://nodejs.org/en/docs/inspector
9230 opened
Debug Proxy online, now you could attach to 9999 without worry about reload.
DevTools → chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9999/__ws_proxy__
And then choose one of the following ways:
DevTools URL printed in the last few lines in console directly. Since this URL is proxied from worker, you don't need to worry about restarting.chrome://inspect, and config port accordingly, then click Open dedicated DevTools for Node to open debug console.egg-bin will read environment variable $NODE_DEBUG_OPTION set in WebStorm debug mode.
Start npm debug in WebStorm:
There are 2 ways:
1st method: open settings in VSCode, turn on Debug: Toggle Auto Attach, and then execute npm run debug in the terminal.
2nd method: setup .vscode/launch.json in VSCode, and then simply start with F5 key. (Note: You have to turn off the settings mentioned in the 1st method before doing it).
// .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Egg",
"type": "node",
"request": "launch",
"cwd": "${workspaceRoot}",
"runtimeExecutable": "npm",
"windows": { "runtimeExecutable": "npm.cmd" },
"runtimeArgs": [ "run", "debug" ],
"console": "integratedTerminal",
"protocol": "auto",
"restart": true,
"port": 9229,
"autoAttachChildProcesses": true
}
]
}
And we offer a vscode-eggjs extention to setup auto-matically.
For more options of setting up debug in VSCode, please refer to Node.js Debugging in VS Code.
If you would like to know more about local development, like customizing a local development tool for your team, please refer to egg-bin.