📦 安装与初始化 >>
npm install --save-dev nps | 项目级安装
npm install -g nps | 全局安装
npm install nps-utils | 安装工具库
项目初始化
# 从package.json迁移到nps
./node_modules/.bin/nps init
# 或使用npx
npx nps init
# 生成package-scripts.js
# 自动迁移现有脚本
nps init会自动将package.json中的scripts迁移到package-scripts.js
⚙️ 配置文件结构 >>
package-scripts.js | JavaScript配置文件(推荐)
package-scripts.yml | YAML配置文件
scripts | 根级脚本配置
JavaScript配置示例
const { series, rimraf, crossEnv } = require('nps-utils')
module.exports = {
scripts: {
default: "node index.js",
clean: rimraf('dist'),
build: series.nps('clean', 'webpack'),
start: crossEnv('NODE_ENV=production', 'node server.js'),
test: 'jest --coverage',
lint: {
js: "eslint .",
css: "stylelint '**/*.css'"
}
}
}
JavaScript配置支持复杂逻辑和代码复用
📝 YAML配置支持 >>
scripts | 定义脚本命令
数组格式 | 支持按顺序执行多个命令
嵌套结构 | 支持点语法访问
YAML配置示例
scripts:
default: node index.js
lint: eslint .
test: jest
build:
- rimraf dist
- webpack
start:
- cross-env NODE_ENV=production
- node server.js
clean:
- rm -rf node_modules
- npm install
YAML配置更简洁,适合简单项目
🛠️ nps-utils工具库 >>
series | 串行执行脚本
parallel | 并行执行脚本
rimraf | 跨平台删除文件
crossEnv | 跨平台环境变量
工具库用法示例
const {
series,
parallel,
rimraf,
crossEnv,
nps
} = require('nps-utils')
module.exports = {
scripts: {
// 串行执行:clean -> build
build: series.nps('clean', 'webpack'),
// 并行执行:lint & test
test: parallel.nps('lint', 'unit'),
// 跨平台删除
clean: rimraf('dist'),
// 环境变量
start: crossEnv('NODE_ENV=production', 'node server.js'),
// 嵌套调用
deploy: series.nps('build', 'start')
}
}
nps-utils提供跨平台兼容的工具函数
📋 CLI命令使用 >>
nps | 运行default脚本
nps help | 显示所有可用脚本
nps script.name | 运行嵌套脚本
nps b | 使用前缀快捷命令
命令执行示例
# 运行默认脚本
nps
# 运行指定脚本
nps build
nps test
# 运行嵌套脚本
nps lint.js
nps lint.css
# 使用前缀快捷
nps b # 等同于 nps build
nps t # 等同于 nps test
nps help b # 显示build脚本帮助信息
前缀功能让脚本调用更快捷
🔌 环境变量配置 >>
LOG_LEVEL | 控制输出详细程度
NPS_PACKAGE_MANAGER | 指定包管理器
NODE_ENV | Node.js环境变量
环境变量设置
# 设置日志级别
export LOG_LEVEL=silent # 静默模式
export LOG_LEVEL=info # 默认级别
export LOG_LEVEL=debug # 调试模式
# 指定包管理器
export NPS_PACKAGE_MANAGER=pnpm
# 临时设置
LOG_LEVEL=debug nps build
环境变量控制nps的行为和输出
🏗️ 高级脚本模式 >>
条件执行 | 基于环境变量的条件脚本
动态脚本 | 运行时生成脚本命令
脚本组合 | 复杂的脚本编排
高级用法示例
const { series, parallel, crossEnv } = require('nps-utils')
module.exports = {
scripts: {
// 条件执行
build: process.env.NODE_ENV === 'production'
? series.nps('clean', 'webpack:prod')
: series.nps('clean', 'webpack:dev'),
// 动态脚本
test: `jest --coverage${process.env.CI ? ' --watchAll=false' : ''}`,
// 复杂编排
deploy: series(
crossEnv('NODE_ENV=production'),
parallel.nps('build', 'test'),
'npm publish'
),
// 环境特定
'build:prod': crossEnv('NODE_ENV=production', 'webpack --mode production'),
'build:dev': crossEnv('NODE_ENV=development', 'webpack --mode development')
}
}
JavaScript配置提供强大的灵活性
🔄 脚本继承与扩展 >>
extends | 继承其他配置文件
scripts覆盖 | 重写继承的脚本
merge | 合并多个配置
配置继承示例
// base-scripts.js
module.exports = {
scripts: {
clean: 'rimraf dist',
lint: 'eslint .',
test: 'jest'
}
}
// package-scripts.js
const baseScripts = require('./base-scripts')
module.exports = {
...baseScripts,
scripts: {
...baseScripts.scripts,
build: series.nps('clean', 'webpack'),
deploy: series.nps('build', 'upload')
}
}
继承机制支持配置的模块化和复用