1. 前提&說明
安裝node.js
說明:本篇文章提到的指令等都是Mac的,在Windows可能有些不同。
2. 注冊(cè)npm賬號(hào)
首先得有一個(gè)npm賬號(hào) 注冊(cè)地址
3. 開始寫我們的模塊
因?yàn)槲覀儼l(fā)布的包不能與已有的npm模塊名沖突,所以建議先檢查一下我們想創(chuàng)建的包是否名字重復(fù)。
校驗(yàn)地址 ,在此頁面中搜索你想創(chuàng)建的npm模塊名稱,看是否已經(jīng)存在。
開始創(chuàng)建我們的項(xiàng)目:(我發(fā)布了一個(gè)正則校驗(yàn)的模塊,以這個(gè)為例)
mkdir regexpForYou
cd regexpForYou
npm init
// package name 為我們發(fā)布后的npm模塊名字
// 其他項(xiàng)可以默認(rèn),直接回車即可
4. 項(xiàng)目目錄結(jié)構(gòu)
先看一下項(xiàng)目目錄結(jié)構(gòu),部分文件稍后會(huì)提到
├── lib // npm run build生成的文件
| ├── index.js
├── src // 項(xiàng)目源碼
| ├── index.js
├── test // 測(cè)試用例
| ├── test.js
├── .babelrc
├── package.json
├── README.md
5. 項(xiàng)目的一些配置
- 安裝babel
因?yàn)槲覀冊(cè)?code>src目錄寫的時(shí)候,用到es6的語法,所以需要用Babel編譯。
npm install --save-dev babel-cli
npm install --save-dev babel-preset-es2015
新建配置.babelrc, 配置 .babelrc
{
"presets": ["es2015"]
}
我們把 src 目錄里的代碼編譯到 lib 目錄,然后我們?cè)?package.json 里,把 "main" 改為 "lib/index.js",這樣對(duì)外暴露出去的代碼就不會(huì)出現(xiàn)兼容性問題。
修改package.json文件的scripts
"scripts": {
"build": "babel src -d lib"
}
這樣運(yùn)行npm run build就會(huì)編譯源文件到 lib 目錄了
6. src文件編寫
在src目錄下,新建reg.js、index.js
// reg.js
export const AmountReg = /^-?(\d|([1-9]\d+))(\.?\d{1,2})?$/
export const PIntReg = /^(\d|([1-9]\d+))$/
export const PNIntReg = /^-?(\d|([1-9]\d+))$/
// index.js
import * as REG from './reg'
export function testAmount(str) {
return REG.AmountReg.test(str)
}
export function testPIntReg(str) {
return REG.PIntReg.test(str)
}
export function testPNIntReg(str) {
return REG.PNIntReg.test(str)
}
7. 單元測(cè)試
為了保證發(fā)布質(zhì)量,需要寫單元測(cè)試,這里我們使用 mocha 和 chai 做測(cè)試
npm install mocha chai --save-dev
新建test文件夾,test.js文件
// test.js
const chai = require('chai')
const should = chai.should()
const regTest = require('../lib/index')
describe("測(cè)試正負(fù)兩位小數(shù)正則",() => {
it('test -2.33 should equal true',() => {
regTest.testAmount('-2.33').should.equal(true)
})
})
describe("測(cè)試正負(fù)兩位小數(shù)正則",() => {
it('test -2.333 should equal false',() => {
regTest.testAmount('-2.333').should.equal(false)
})
})
describe("測(cè)試正整數(shù)",() => {
it('test -2 should equal false',() => {
regTest.testPIntReg('-2').should.equal(false)
})
})
describe("測(cè)試正整數(shù)",() => {
it('test 2 should equal true',() => {
regTest.testPIntReg('2').should.equal(true)
})
})
describe("測(cè)試正負(fù)整數(shù)",() => {
it('test -2 should equal true',() => {
regTest.testPNIntReg('-2').should.equal(true)
})
})
describe("測(cè)試正負(fù)整數(shù)",() => {
it('test 2 should equal true',() => {
regTest.testPNIntReg('2').should.equal(true)
})
})
describe("測(cè)試正負(fù)整數(shù)",() => {
it('test 2.22 should equal false',() => {
regTest.testPNIntReg('2.22').should.equal(false)
})
})
修改package.json文件的scripts
"scripts": {
"test": "npm run build && mocha -t 5000"
}
在終端執(zhí)行npm run test,看到執(zhí)行結(jié)果
測(cè)試正負(fù)兩位小數(shù)正則
? test -2.33 should equal true
測(cè)試正負(fù)兩位小數(shù)正則
? test -2.333 should equal false
測(cè)試正整數(shù)
? test -2 should equal false
測(cè)試正整數(shù)
? test 2 should equal true
測(cè)試正負(fù)整數(shù)
? test -2 should equal true
測(cè)試正負(fù)整數(shù)
? test 2 should equal true
測(cè)試正負(fù)整數(shù)
? test 2.22 should equal false
7 passing (8ms)
8. 發(fā)布自己的npm模塊
- 首次上傳:
npm login
// 根據(jù)提示輸入之前注冊(cè)的賬號(hào)、密碼
// 發(fā)布npm包:
npm publish
- 更新自己的NPM包:
npm version patch
npm publish
// npm version后面參數(shù)說明:
// patch:小變動(dòng),比如修復(fù)bug等,版本號(hào)變動(dòng) v1.0.0->v1.0.1
// minor:增加新功能,不影響現(xiàn)有功能,版本號(hào)變動(dòng) v1.0.0->v1.1.0
// major:破壞模塊對(duì)向后的兼容性,版本號(hào)變動(dòng) v1.0.0->v2.0.0
9. 使用自己發(fā)布的模塊
npm install --save regexp-for-you
const regexp = require('regexp-for-you');
console.log(regexp.testAmount('-2.333'))
運(yùn)行示例代碼:node test.js ,輸出 false,和預(yù)期一致。