简介
- 推荐操作
1 | # 设置镜像 |
nvm Node版本管理工具
- nvm全名node.js version management,顾名思义是一个nodejs的版本管理工具,通过它可以安装和切换不同版本的nodejs
- 相似的如
n
- 参考下文基于目录自动切换node版本
- 相似的如
- 下载安装
- windows下载,安装之前可能需要先卸载之前安装的Node
- Unix:
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.38.0/install.sh | bash
- Mac M1 安装v11.4安装成功,但是安装node v10.x失败,v12.x成功
- Mac M1 安装v14.20.1失败:需要切换成x86模式才能安装成功,参考mac.md#M1模拟x86环境
- 报错
libtool: unrecognized option -static'
,解决方案: https://stackoverflow.com/questions/38301930/libtool-unrecognized-option-static (前提是通过xcode-select --install
安装了CommandLineTools, 即有次文件夹) - 报错
'stdio.h' file not found
,解决方案: https://blog.51cto.com/u_15639793/5297367 (3个步骤都要执行) - 报错
clang: error: linker command failed
,暂未解决
- 报错
- 使用
1 | # 查看可用LTS node版本 |
- 基于目录自动切换node版本
- 使用avn工具: https://segmentfault.com/a/1190000040908989
- 使用自定义脚本: https://stackoverflow.com/questions/23556330/run-nvm-use-automatically-every-time-theres-a-nvmrc-file-on-the-directory
- 在
.zshrc
或.bashrc
目录创建脚本 - 在需要切换node版本的目录创建
.nvmrc
文件,并写入对应版本如v16.19.0
- 此时打开此目录命令行就会自动执行命令进行node切换
- 在
npm 包管理工具
npm安装及镜像
- 安装node的时候会默认包含npm
npm install npm@latest -g
更新npmnpm -v
查看npm版本
- 设置镜像
1 | # 大部分组件通过npm设置为淘宝镜像即可加速,但是像electron-mirror、node-sass等组件需要额外设置镜像地址配置到`~/.npmrc`才能成功下载。具体[参考下文mirror-config-china](#mirror-config-china) |
- 或者安装cnpm镜像(淘宝镜像下载较快):
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install <pkg>
安装模块
.npmrc文件
.npmrc
可以理解成npm running cnfiguration,即npm运行时配置文件- .npmrc 配置文件的优先级
- 临时配置(如
npm --registry=https://registry.npm.taobao.org [npm命令]
) - 项目配置文件: /project/.npmrc
- 用户配置文件: ~/.npmrc (可通过
npm config get userconfig
获取) - 全局配置文件: $PREFIX/etc/npmrc (可通过
npm config get prefix
获取全局文件路径) - npm安装包默认的路径: /path/to/npm/npmrc
- 临时配置(如
- 配置(以key=value的形式存储)
1 | # 以@test开头的包从 registry=https://npm.xx.com 这里下载,其余全去淘宝镜像下载 |
- 配置用户和全局配置文件
1 | # 增加或删除某个配置 |
查看包/安装包/启动项目
- NPM包分析工具
- CND访问
- 国内的CND一般从 https://cdnjs.com/ 上同步的,但是CNDJS上的NPM包不全
- 国内支持所有NPM的(类似unpkg)
- 饿了么: npm.elemecdn.com、github.elemecdn.com
- 知乎: unpkg.zhimg.com
- 基于国外
https://unpkg.com/<package>@<version>/<file>
- 基于国外
https://cdn.jsdelivr.net/npm/<package>@<version>/<file>
- npm包源码在线查看工具, npm官网也提供源码查看功能
- npm软件包的体积和加载性能在线分析工具
- npm依赖在线分析工具(显示有点乱)
- 本地可使用
npm ls > tree.log
查看,参考下文 - 参考:https://www.cnblogs.com/shengulong/p/9463435.html
- 本地可使用
- CND访问
1 | npm -h |
发布包
- NPM包分析工具
1 | ## 发布包: https://blog.csdn.net/imqdcn/article/details/126569123 |
自动递增版本
- npm 允许在package.json文件里面,使用scripts字段定义脚本命令
- 比较特别的是,npm run新建的这个 Shell,会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样
- 这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径
- package.json参考
- 命令行修改版本号(执行命令会读取并修改package.json中的版本)
1 | # major.minor.patch premajor/preminor/prepatch/prerelease |
其他特性
- npm link 本地库文件关联
- 其他如npm link引用本地模块的方法参考:https://blog.csdn.net/zhangxin09/article/details/119344515
1 | # 将当前包关联到本地全局路径 |
- 传参和通配符
- 向 npm 脚本传入参数,要使用–标识。对于脚本
"lint": "jshint **.js"
,执行npm run lint
命令传入参数,必须写成npm run lint -- --reporter checkstyle > checkstyle.xml
- 上面代码中,表示任意文件名,**表示任意一层子目录;如果要将通配符传入原始命令,防止被 Shell 转义,要将星号转义,如`”test”: “tap test/\.js”`
- 向 npm 脚本传入参数,要使用–标识。对于脚本
变量
1
2
3
4
5
6
7
8"script": {
// 通过`npm_package_`前缀,npm 脚本可以拿到package.json里面的字段。如: npm_package_scripts_prebuild 可以拿到上文属性值
// 通过`npm_config_`前缀,拿到 npm 的配置变量,即`npm config get xxx`命令返回的值。注意,package.json里面的config对象,可以被环境变量覆盖
"view": "echo $npm_config_tag",
// `env`命令可以列出所有环境变量
// 只要执行 vue-cli-service build 则 process.env.NODE_ENV='production'
"lib": "vue-cli-service build --target lib --dest lib --name WpluginVariantForm install.js"
}process.env.npm_config_argv
- 如执行
npm run lib
则上述参数为字符串'{"remain":[],"cooked":["run","lib"],"original":["run", "lib"]}'
,可通过JSON.parse(process.env.npm_config_argv).original
拿到原始命令参数。但是如果是cnpm执行则获取的参数顺序可能不一样
- 如执行
process.argv
- 如执行
npm run build --target lib
则上述参数为数组['/usr/local/bin/node', '/Users/smalle/demo/node_modules/.bin/vue-cli-service', 'build', '--target', 'lib', '--dest', 'lib', '--name', 'WpluginVariantForm', 'install.js']
- 如执行
- 执行顺序
npm run script1.js & npm run script2.js
并行执行npm run script1.js && npm run script2.js
顺序执行
钩子
1
2
3
4
5
6
7
8"script": {
// 钩子: npm 脚本有pre和post两个钩子
// 用户执行npm run build的时候, 相当于执行 npm run prebuild && npm run build && npm run postbuild
// process.env.npm_lifecycle_event 可获取当前运行的脚本名称
"prebuild": "echo I run before the build script",
"build": "cross-env NODE_ENV=production webpack",
"postbuild": "echo I run after the build script",
}默认值
npm run start
的默认值是node server.js,前提是项目根目录下有server.js这个脚本npm run install
的默认值是node-gyp rebuild,前提是项目根目录下有binding.gyp文件
基于GitHub-Packages创建npm私有库
- 参考: https://www.jianshu.com/p/9b7c2d9b30b3
- 此方法产生的npm包,不会出现在npm官网上。且只支持私有库
- 模块package.json中增加如
1 | { |
- 创建脚本
github-npm-publish.sh
(脚本中的github密码使用token代替,可在github个人中心中创建token)
1 |
|
- 发布完成在aezocn的主页-Packages中会显示
- 使用
- 在应用项目中创建
.npmrc
,并设置镜像(此处单独设置aezocn开头的包此使用此镜像进行拉取) - 然后
npm i
即可
- 在应用项目中创建
1 | @aezocn:registry=https://npm.pkg.github.com/aezocn |
基于Nexus搭建私有仓库
基于git仓库进行安装
- 参考:https://blog.csdn.net/xiaolinlife/article/details/119760310
- 创建私有包package.json
1 | { |
- 打包项目到lib包中,并将项目上传到git仓库
- 应用项目安装此模块
1 | # 如果是公开项目则可省略用户名密码(私有项目不填则在安装是需要输入仓库密码) |
yarn 包管理工具
- 官网:https://yarnpkg.com/zh-Hans/
- 安装
npm install -g yarn
,通过官网的msi
容易报’yarn’ 不是内部或外部命令,也不是可运行的程序 - 类似于
npm
,基于package.json
进行包管理 设置镜像
1
2
3
4yarn get registry # 查看镜像
yarn config set registry https://registry.npm.taobao.org/ # 设置为淘宝镜像
yarn config set registry https://registry.npmjs.org/ # 设置为官方镜像
yarn config list # 查看配置使用
1 | # 查看版本 |
pnpm 包管理工具
- pnpm
- performant npm,意味”高性能的 npm”,pnpm由npm/yarn衍生而来
- 速度快、节约磁盘空间、支持monorepo、安全性高
1 | # 安装 |
nrm 镜像管理工具
- nrm 是一个 npm 源管理器,允许你快速地在 npm源间切换
设置npm镜像为taobao镜像
1
2npm set registry https://registry.npm.taobao.org/
npm config ls # 查看配置nrm使用
1 | # 安装 |
mirror-config-china
- 大部分组件通过npm设置为淘宝镜像即可加速,但是像electron-mirror、node-sass等组件需要额外设置镜像地址配置到
~/.npmrc
才能成功下载,此插件将常用组件的镜像地址全部加入到了上述文件夹
1 | # https://www.npmjs.com/package/mirror-config-china |
npx Node包执行工具
- npm 从5.2版开始,增加了 npx 命令,用来执行Node包命令
- npm内置此工具,或手动安装
npm install -g npx
- npm内置此工具,或手动安装
- 使用 ^1
1 | ## 调用项目安装的模块(会到node_modules/.bin路径和环境变量$PATH里面去检查命令) |
vue 命令行工具(vue-cli)
1 | # 可选安装,只是为了快捷创建项目,或管理项目插件. mac需要root账号安装 |
lerna多包管理器
1 | # 目前最新版本为6.0.1, v5.6.2 要求node v14.15; v3.22.1 要求node v6.9.0 |
- lerna.json 说明
1 | { |
开发库
babel
- babeljs中文网
babel
(@babel/core) 是一个转码器,可以将es6,es7转为es5代码- Babel默认只转换新的JavaScript句法(syntax),而不转换新的API,比如Iterator、Generator、Set、Maps、Proxy、Reflect、Symbol、Promise等全局对象,以及一些定义在全局对象上的方法(比如Object.assign)都不会转码
- 所以为了使用完整的 ES6 的API,我们需要另外安装:babel-polyfill 或者 babel-runtime ^2
@babel/polyfill
会把全局对象统统覆盖一遍,不管你是否用得到。缺点:包会比较大100k左右。如果是移动端应用,要衡量一下。一般保存在dependencies中babel-runtime
可以按照需求引入。缺点:覆盖不全。一般在写库的时候使用。建议不要直接使用babel-runtime,因为transform-runtime依赖babel-runtime,大部分情况下都可以用transform-runtime
预设来达成目的
- core-js 是 babel-polyfill、babel-runtime 的核心包,他们都只是对 core-js 和 regenerator 进行的封装。core-js 通过各种奇技淫巧,用 ES3 实现了大部分的 ES2017 原生标准库,同时还要严格遵循规范。支持IE6+
- core-js 组织结构非常清晰,高度的模块化。比如
core-js/es6
里包含了 es6 里所有的特性。而如果只想实现 promise 可以单独引入core-js/features/promise
- core-js 组织结构非常清晰,高度的模块化。比如
babel配置文件可为
.babelrc
或babel.config.js
(v7.8.0)。以babel.config.js
为例1
2
3
4
5
6
7
8
9
10
11module.exports = {
presets: ['@vue/cli-plugin-babel/preset'],
plugins: [
// 一般在写库的时候使用,包含了 babel-runtime
// 配置了 transform-runtime 插件,就不用再手动单独引入某个 `core-js/*` 特性,如 core-js/features/promise,因为转换时会自动加上而且是根据需要只抽离代码里需要的部分
"transform-runtime",
// 基于vue的预设
// "@vue/app",
]
}@babel/cli
在命令行中使用babel命令对js文件进行转换。如babel entry.js --out-file out.js
进行语法转换- 插件
- 基于Babel的插件参考:https://www.babeljs.cn/docs/plugins
- 预设(Presets, 一批插件的组合)
- 需要基于某个环境进行开发,如typescript,则需手动安装一堆 Babel 插件,此时可以使用 Presets(包含了一批插件的组合)。可以设置到presets或plugins节点
- 官方 Preset 已经针对常用环境编写了一些 preset。其他社区定义的预设可在npm上获取
@babel/preset-env
对浏览器环境的通用支持(es6转es5)@babel/preset-react
对 React 的支持@babel/preset-typescript
对 Typescript 支持,参考typescript.md#Webpack转译Typescript现有方案@babel/preset-flow
如果使用了 Flow,则建议您使用此预设(preset),Flow 是一个针对 JavaScript 代码的静态类型检查器@vue/app
对 Vue 的支持
- 常见安装
1 | # 语法转换 |
npm-run-all
npm install npm-run-all --save-dev
安装npm-run-all
提供了多种运行多个命令的方式,常用的有以下几个--serial
: 多个命令按排列顺序执行,例如:npm-run-all --serial clean build:**
先执行当前package.json中 npm run clean 命令, 再执行当前package.json中所有的build:
开头的scripts--parallel
: 并行运行多个命令,例如:npm-run-all –parallel lint build--continue-on-error
: 是否忽略错误,添加此参数 npm-run-all 会自动退出出错的命令,继续运行正常的--race
: 添加此参数之后,只要有一个命令运行出错,那么 npm-run-all 就会结束掉全部的命令
- 案例
1 | "scripts": { |
rollup.js
- Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码,例如 library 或应用程序
- rollupjs
Vite
patch-package手动npm包打补丁
postcss
- https://github.com/postcss/postcss
- 用 JavaScript 工具和插件转换 CSS 代码的工具
- postcss插件编写
- PostCSS 是利用 JS 对CSS 代码进行转换处理。借助各种 PostCSS 插件可以用来为CSS 属性进行增删改查等操作(如: 添加浏览器兼容前缀、px转rem…), PostCSS 底层已经将 CSS 转义成 AST, 而我们开发一个 PostCSS 插件其实就是通过 JS 操作这个 AST 即可。参考:https://juejin.cn/post/7126455957508325407
- 在线 CSS to AST
- PostCSS 8 插件不兼容 PostCSS 7 版本
- 事件(钩子)参考:https://postcss.org/api/#plugin
- Root: CSS 语法树, 代表 css 文件
- AtRule: 以@开头的内容(如: @media(screen){})
- Rule: 已声明的选择器(如: input, button{})
- Declaration: 属性名-属性值(如: color: red)
- Comment: 注释
- 案例参考(不用打包,提交npm安装即可):https://github.com/postcss/postcss-focus
- 初始化一个插件
npx postcss-plugin-boilerplate --npm postcss-mytest
格式规范化
eslint格式化
- vscode等编辑安装eslint插件,相关配置参考vscode.md#插件推荐
- 项目直接安装
基于vue-cli安装,参考:https://eslint.vuejs.org/
- @vue/cli eslint插件使用参考: https://www.cnblogs.com/qq3279338858/p/16492830.html
vue add eslint
基于vue安装插件,选择Standard、Lint on save- 安装完成默认会自动执行
vue-cli-service lint
,即对所有文件进行格式修复(只会修复部分,剩下的仍然需要人工修复),实际执行命令为eslint --fix --ext .js,.vue src
安装后会在package.json中增加如下配置,安装对应的包到项目目录,并增加文件
.eslintrc.js
和.editorconfig
1
2
3
4
5
6
7
8
9
10
11
12
13"scripts": {
"lint": "vue-cli-service lint",
},
"devDependencies": {
"@vue/cli-plugin-eslint": "~4.5.0",
"@vue/eslint-config-standard": "^5.1.2",
"eslint": "^6.7.2",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.0",
"eslint-plugin-vue": "^6.2.2"
}
支持多种配置文件格式:.eslintrc.js、.eslintrc.yaml、.eslintrc.json、.eslintrc(弃用)、在package.json增加eslintConfig属性。且采用就近原则
.eslintrc.js
放在vue项目根目录,详细参考:https://cn.eslint.org/ [^10]
1 | // 不填任何规则,相当于禁用了eslint(对于vscode安装了插件,但是项目又不想启动校验的情况) |
.eslintignore
放在vue项目根目录
1 | # 不进行校验的的文件或文件夹 |
- 代码中不进行校验
1 | /* eslint-disable */ |
.prettierrc/.jsbeautifyrc/.editorconfig格式化
- Eslint、.editorconfig等区别
- Eslint 更偏向于对语法的提示,如定义了一个变量但是没有使用时应该给予提醒
- .editorconfig 更偏向于简单代码风格,如缩进等
- .prettierrc 更偏向于代码美化
- 二者并不冲突,同时配合使用可以使代码风格更加优雅
- Prettier插件
- 文件需要配合插件使用,如vscode的Prettier插件(推荐)
- 相应的配置文件(选一个即可)
.prettierrc
prettier.config.js
项目根目录配置文件,常用配置参考下文package.json
中的prettier
属性
- 可增加脚本进行批量格式化代码
"prettier": "prettier --write '**/*.{js,css,scss,less,ts,vue,html}'"
(安装 eslint-plugin-prettier 和 eslint-config-prettier 模块)
.jsbeautifyrc
代码格式化- 文件需要配合插件使用,如vscode的
Beautify
插件
- 文件需要配合插件使用,如vscode的
.editorconfig
文件需要配合插件使用,如vscode的Editorconfig
插件- 该插件的作用是告诉开发工具自动去读取项目根目录下的 .editorconfig 配置文件,如果没有安装这个插件,光有一个配置文件是无法生效的
- 此插件配置的格式优先于vscode配置的,如缩进;常用配置参考下文
- prettier.config.js 常用配置
1 | module.exports = { |
.editorconfig
放在vue项目根目录
1 | # http://editorconfig.org |
在线工具
- StackBlitz 是一款在线 IDE(可直接运行项目),主要面向 Web 开发者,移植了很多 VS Code 的特性与功能
参考文章