A technique you might use once you start having lots of npm scripts is to use a node package that allows you to define your scripts in an external package-scripts.js file. By pulling out your scripts it can help with organization, enable better comments, provide shortcuts, and more.

Install:

npm i -D p-s

Run:

node_modules/.bin/p-s init

Then if we check package.json file, we found that the scripts from:

  "scripts": {
"start": "node index.js",
"poststart": "npm run build && npm run server",
"pretest": "npm run lint",
"test": "BABEL_ENV=test mocha spec/ --require babel-register",
"cover": "nyc npm t",
"postcover": "rm -rf .nyc_output",
"cover:open": "open coverage/index.html",
"lint": "npm-run-all lint:**",
"lint:js": "eslint --cache --fix ./",
"lint:css": "stylelint '**/*.scss' --syntax scss",
"lint:css:fix": "stylefmt -R src/",
"watch": "npm-run-all --parallel watch:*",
"watch:test": "npm t -- --watch",
"watch:lint": "onchange 'src/**/*.js' 'src/**/*.scss' -- npm run lint",
"build": "npm-run-all build:*",
"prebuild": "rm -rf public/$npm_package_version",
"build:html": "pug --obj data.json src/index.pug --out public/$npm_package_version/",
"build:css": "node-sass src/index.scss | postcss -c .postcssrc.json | cssmin > public/$npm_package_version/index.min.css",
"build:js": "mustache data.json src/index.mustache.js | uglifyjs > public/$npm_package_version/index.min.js",
"server": "npm-run-all --parallel server:*",
"server:create": "http-server public/$npm_package_version -p $npm_package_config_port",
"server:launch": "open http://localhost:$npm_package_config_port",
"prepush": "npm run lint"
},

to:

  "scripts": {
"start": "nps",
"test": "nps test"
},

We still can run 'npm start' & 'npm t', the actual scripts points to package-script.js file:

module.exports = {
scripts: {
default: 'node index.js',
poststart: 'npm run build && npm run server',
pretest: 'npm run lint',
test: 'BABEL_ENV=test mocha spec/ --require babel-register',
cover: {
default: 'nyc npm t',
open: 'open coverage/index.html'
},
postcover: 'rm -rf .nyc_output',
lint: {
default: 'npm-run-all lint:**',
js: 'eslint --cache --fix ./',
css: {
default: 'stylelint \'**/*.scss\' --syntax scss',
fix: 'stylefmt -R src/'
}
},
watch: {
default: 'npm-run-all --parallel watch:*',
test: 'npm t -- --watch',
lint: 'onchange \'src/**/*.js\' \'src/**/*.scss\' -- npm run lint'
},
build: {
default: 'npm-run-all build:*',
html: 'pug --obj data.json src/index.pug --out public/$npm_package_version/',
css: 'node-sass src/index.scss | postcss -c .postcssrc.json | cssmin > public/$npm_package_version/index.min.css',
js: 'mustache data.json src/index.mustache.js | uglifyjs > public/$npm_package_version/index.min.js'
},
prebuild: 'rm -rf public/$npm_package_version',
server: {
default: 'npm-run-all --parallel server:*',
create: 'http-server public/$npm_package_version -p $npm_package_config_port',
launch: 'open http://localhost:$npm_package_config_port'
},
prepush: 'npm run lint'
}
};

Now there are some problems we need to fix before it can run all the scripts.

1. Add help command:

Now if we run

npm run

/*
start
nps
test
nps test
*/

We can only see two scripts.

But we can run:

npm start -- --help

Then we able to see all the scripts:

For a more convenient way, we can create a help script:

"help": "npm start -- --help"

or just:

"help": "nps --help"

2. We can add "description" to package-scripts.js to make each command more clear why to use.

So for example, I can "test" script in package-scripts.js from:

test: 'BABEL_ENV=test mocha spec/ --require babel-register',

to:

    test: {
script: 'BABEL_ENV=test mocha spec/ --require babel-register',
description: 'Run the mocha tests'
},

Now if we run help command:

test - Run the mocha tests - BABEL_ENV=test mocha spec/ --require babel-register

We can see the description also.

3. There is no 'npm-run-all' package for 'p-s'

For example:

    lint: {
default: 'npm-run-all lint:**',
js: 'eslint --cache --fix ./',
css: {
default: 'stylelint \'**/*.scss\' --syntax scss',
fix: 'stylefmt -R src/'
}
},

We can change to:

    lint: {
default: 'nps lint.js,lint.css,lint.fix',
js: 'eslint --cache --fix ./',
css: {
default: 'stylelint \'**/*.scss\' --syntax scss',
fix: 'stylefmt -R src/'
}
},

Another example:

    watch: {
default: 'npm-run-all --parallel watch:*',
test: 'npm t -- --watch',
lint: 'onchange \'src/**/*.js\' \'src/**/*.scss\' -- npm run lint'
},

'nps' understand '--parallel' flag, so we can change this script to:

    watch: {
default: 'nps watch.test,watch.lint --parallel',
test: 'npm t -- --watch',
lint: 'onchange \'src/**/*.js\' \'src/**/*.scss\' -- npm run lint'
},

4. 'nps' doesn't support 'pre-' or 'post-' scripts.

For the post- scripts: using '&&' 

For example:

    default: 'node index.js',
poststart: 'npm run build && npm run server',

We have poststart, we can change to:

default: 'node index.js && nps build,server',

For the pre- scripts:

For example:

    pretest: 'npm run lint',
test: {
script: 'BABEL_ENV=test mocha spec/ --require babel-register',
description: 'Run the mocha tests'
},

we can change to:

    test: {
default: {
script: 'nps lint,test.run',
description: 'Run the mocha tests'
},
run: 'BABEL_ENV=test mocha spec/ --require babel-register',
},

Example2:

change from:

    cover: {
default: 'nyc npm t',
open: 'open coverage/index.html'
},
postcover: 'rm -rf .nyc_output',

to:

    cover: {
default: 'nyc npm t && nps cover.clean',
open: 'open coverage/index.html',
clean: 'rm -rf .nyc_output',
},

Example3:

From:

    build: {
default: 'nps build.html,build.css,build.js',
html: 'pug --obj data.json src/index.pug --out public/$npm_package_version/',
css: 'node-sass src/index.scss | postcss -c .postcssrc.json | cssmin > public/$npm_package_version/index.min.css',
js: 'mustache data.json src/index.mustache.js | uglifyjs > public/$npm_package_version/index.min.js'
},
prebuild: 'rm -rf public/$npm_package_version',

to:

    build: {
default: 'nps build.clean,build.html,build.css,build.js',
clean: 'rm -rf public/$npm_package_version',
html: 'pug --obj data.json src/index.pug --out public/$npm_package_version/',
css: 'node-sass src/index.scss | postcss -c .postcssrc.json | cssmin > public/$npm_package_version/index.min.css',
js: 'mustache data.json src/index.mustache.js | uglifyjs > public/$npm_package_version/index.min.js'
},

Example4:

prepush: 'npm run lint'

Move to package.json file:

"prepush": "nps lint"

So now if you want to run any script, you can do:

npm start lint
npm start build.js

Aslo nps provides shortcut to run script:

npm start build.html

// the same as

npm start b.h

If you install 'p-s' grobally, you can run any command by:

nps lint
nps build

[NPM] Pull out npm scripts into another file with p-s的更多相关文章

  1. NPM 使用及npm升级中问题解决

    NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...

  2. [转] 合理使用npm version与npm dist-tag详解

    第一步:发布第一个稳定版本 npm publish//1.0.0 第二步:修改文件继续发布第二个版本 git add -A && git commit -m "c" ...

  3. npm link & run npm script

    npm link & run npm script https://blog.csdn.net/juhaotian/article/details/78672390 npm link命令可以将 ...

  4. [转]adb pull Permission denied及no such file错误

    adb pull  Permission denied及no such file错误 http://www.the8m.com/blog/article/javadk/adbpull.html XP系 ...

  5. angular2 学习笔记 ( angular cli & npm version manage npm 版本管理 )

    更新 : 2017-05-05 现在流行 Yarn ! 它是 facebook google 推出的东西. 算是补助 npm 做的不够好的地方. 源码依然是发布去 npm,只是下载接口换掉罢了哦. n ...

  6. 【npm】利用npm安装/删除/发布/更新/撤销发布包

      什么是npm? npm是javascript的包管理工具,是前端模块化下的一个标志性产物 简单地地说,就是通过npm下载模块,复用已有的代码,提高工作效率   1.从社区的角度:把针对某一特定问题 ...

  7. npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script build`?

    跑npm build结果如下: npm WARN build `npm build` called with no arguments. Did you mean to `npm run-script ...

  8. npm汇总:npm命令 + 实用插件

    一.npm常用命令,以便查阅: npm install     //运行npm install可根据package.json的配置自动安装所有依赖包 npm uninstall   //卸载依赖,如n ...

  9. npm 取消代理 npm config delete proxy

    今天在安装electron时设置了代理,发现再npm install 安装别的总是装不上,只好取消代理. npm 取消代理 npm config delete proxy

随机推荐

  1. SpringMVC,Mybatis,FreeMarker连接mycat示例(一)

    首页 > 程序开发 > 软件开发 > Java > 正文 SpringMVC,Mybatis,FreeMarker连接mycat示例(一) 项目结构如图: 首先是各种配置文件, ...

  2. oracle学习之路(二)------数组类型/记录类型的使用

    Oracle记录类型介绍 RECORD:用户自己定义数据类型,由单行多列的标量构成的复合数据类型.它将一个或多个标量封装成一个对象进行操作记录不能够总体拿来比較也不能够总体推断为空.能够总体拿来赋值. ...

  3. CentOS卸载Apache方法

    https://www.kafan.cn/edu/49420412.html CentOS卸载Apache方法 首先关闭httpd服务 /etc/init.d/httpd stop 列出httpd相关 ...

  4. JSP中的EL表达式详细介绍

    一.JSP EL语言定义 EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能.脚本编制元素是指页面中能够用于在 JSP 文件中嵌入 Java 代码的元素.它们通常用于对象操作以及执行那些 ...

  5. R语言- 基本统计分析

    目的: 1.描述性统计分析 2.频数表和;列连表 3.相关系数和协方差 4.t检验 5.非参数统计 在上一节中使用了图形来探索数据,下一步就是给出具体的数据来描述每个变量的分布和关系 1.描述性统计分 ...

  6. 好记性不如烂笔头——double

    两个数据转换成double型做差,会出现误差,转换成Decimal就OK了.

  7. POJ 1064 Cable master 浮点数二分

    http://poj.org/problem?id=1064 题目大意: 有N条绳子,他们的长度分别为Li,如果从它们中切割出k条长度相同的绳子的话,这K条绳子每条能有多长? 思路: 二分,设答案为m ...

  8. 【AtCoder Beginner Contest 074 A】Bichrome Cells

    [链接]h在这里写链接 [题意] 在这里写题意 [题解] 在这里写题解 [错的次数] 0 [反思] 在这了写反思 [代码] #include <bits/stdc++.h> using n ...

  9. x=min(x, y)

    x = min(x, y); ⇒ 当然 y 会有多个值传递进来 minHeight = min(minHeight, h[i]); 置于循环之中,不断将当前得到的最小高度值和新加入进来的值进行比较: ...

  10. python课程:python3函数

    摘自廖雪峰的网站:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316 ...