typescript 构建编写发布包流程

typescript 构建编写发布包流程
  • 初始化
  • 修改 tsconfig.json 配置
  • husky构建代码检查
    • 安装husky,tslint, prettier
    • 配置tslint, prettier
  • 配置typedoc
    • 安装typedoc
    • 生成docs文档
    • 配置nginx
    • 添加自动刷新文档功能
      • 安装gulp-nodemon, browser-sync
      • 配置glupfile.js
      • 编写server.js
  • 编写插件代码
    • 方法库
    • 组件库
  • 添加单元测试
    • jest方法测试
    • jset与ensyme组件测试
  • tsc 打包
    • 分文件打包
    • 按需加载
  • 发布到 npm
初始化
创建远程仓库
git clone https://github.com/xxx/xxx.git
npm init -y
npm i typescript -D
tsc --init
修改 tsconfig.json 配置

{
  "compilerOptions": {
    "declaration": true,
    "target": "es6",
    "module": "es6",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true
  },
  "typedocOptions": {
    "mode": "modules",
    "out": "docs",
    "target": "es6",
    "theme": "default",
    "isolatedModules": false, //将每个文件作为单独的模块。
  },
  "include": [".tmp/**/*"],
  "exclude": ["node_modules"]
}

husky构建代码检查
// 1.安装 美化代码库prettier,代码检查库tslint。注:prettier某些配置会和tslint冲突,有些配置需要统一
npm i prettier tslint tslint-config-prettier -D

 // 2.添加tslint配置
 {
  "extends": ["tslint:recommended", "tslint-config-prettier"],
  "rules": {
    "no-console": false,
    "object-literal-sort-keys": false,
    "member-access": false,
    "ordered-imports": false
  },
  "linterOptions": {
    "exclude": ["**/*.json", "node_modules"]
  }
}

// 3.添加.perttierrc配置
{
  "trailingComma": "all",
  "tabWidth": 4,
  "semi": false,
  "singleQuote": true,
  "endOfLine": "lf",
  "printWidth": 120,
  "overrides": [
    {
      "files": ["*.md", "*.json", "*.yml", "*.yaml"],
      "options": {
        "tabWidth": 2
      }
    }
  ]
}

// 4.package.json添加相关内容
script: {
    ...,
    "format": "prettier --write \"src/**/*.ts\" \"src/**/*.js\"",
    "lint": "tslint -p tsconfig.json",
    ...
}
...
"husky": {
    "hook": {
      "pre-commit": [
        "lint"
      ]
    }
 }
 

配置doc
// 1.安装相关插件
npm i -D gulp typedoc gulp-typedoc


// 2.生成docs文件命令
typedoc src //即将src下的文件生成文档默认生成文档文件夹为docs


// 3.配置nginx
{
    listen 10015;
    server_name  127.0.0.1;
    location / {
      root docs目录
      index index.html index.htm;
    }
}

//文档修改后监听自动刷新,使用browser-sync,gulp-nodemon
  // 1.安装插件
  npm i -D gulp-nodemon browser-sync
  // 2.编写glupfile.js
  var gulp = require('gulp');
  /* 创建实例并允许创建多个服务器或代理。*/
  var browserSync = require('browser-sync').create();
  var reload = browserSync.reload;
  var nodemon = require('gulp-nodemon');
  /* gulp server命令*/
  gulp.task('server', function() {
    nodemon({
        script: 'server.js',
        /* 忽略部分对程序运行无影响的文件的改动,nodemon只监视js文件,可用ext项来扩展别的文件类型*/
        ignore: ["gulpfile.js", "node_modules/", "public/**/*.*"],
        ext: 'ts',
        env: {
            'NODE_ENV': 'development'
        }
    }).on('start', function() {
        browserSync.init({
            proxy: 'http://localhost:10015',
            files: ["docs/index.html"],
            port: 10015
        }, function() {
            console.log("browser refreshed.");
        });
        /* 重新生成docs文件后刷新浏览器*/
        gulp.watch("docs/*.*").on('change', reload);
    })
  });
  
  // 3.编写server.js
  
    const http = require('http')
    const cp = require('child_process');
    const chalk = require('chalk')
    
    const port     = 10016
    const hostname = 'localhost';
    const browserSync = require('browser-sync').create();

    /*检测端口是否被占用*/
    function portIsOccupied() {
      const server = net.createServer().listen(port)
      return new Promise((resolve, reject) => {
        server.on('listening', () => {
          server.close()
          resolve()
        })
        server.on('error', (err) => {
          if (err.code === 'EADDRINUSE') {
            console.log(chalk.green(`${port}端口已占用,尝试使用${port + 1}端口...`))
            port++
            resolve(portIsOccupied())
          } else {
            console.error('发生错误:', err);
            reject(err)
          }
        })
      })
    }

    http.createServer()
      .listen(port, hostname, () => {
        console.info(`listening on http://${hostname}:${port}`)
        cp.spawn(`yarn`, ['build:doc'], { cwd: process.cwd(), stdio: 'inherit' }, (err, stdout, stderr) => {
          if (err || stderr !== '\n') {
            console.warn('更新失败:', err, '\n', stderr);
            return;
          }
          console.log(chalk.green('更新完成'));
        });
    })



编写插件代码

文档目录

你可能感兴趣的:(typescript 构建编写发布包流程)