内部前端工具平台搭建

这是什么?

  • 前端组内部的脚本工具沉淀在这个地方,可以让组员很方便的共享和使用
  • 我们希望能像执行linux命令一样去执行一些简洁命令,如:fe xx,然后能实现一些功能

想达到的效果?

  • 类似 npm install -g eslint 后,终端输入eslint,就可以执行eslint的校验脚本
  • 我们是执行 fe xx , 可以执行我们自己的脚本

先设计如何使用,后实现 (fe是font-end的缩写)

  1. 安装:npm install -g @myCompany/fe
  2. 使用: ```javascript fe 或 fe -h 查看帮助 fe -v 查看版本

实际使用平台工具,举例: 终端输入:fe // 以下会打印 cli 脚手架拉取内部模板 mock 切换到mock模式. 根据fe.config.js内的apiAndMock对象 api 正常模式: 从mock模式切换到api模式. 根据fe.config.js内的apiAndMock对象 api-pkg pkg模式: 切换到api模式, 且把响应的返回值在包一层, 简化输出. 根据fe.config.js内的apiAndMock对象 route 根据fe.config.js内的route对象, 自动生成./route/routes.js 和 路由对应的 .vue文件(./src/components内), file-route 根据传入的参数监听目录(默认监听 components 目录),当文件发生变化时自动生成 ./route/routes.js 文件。(eg: fe file-route views 监听 views 目录) lan 中文提词及回填工具, 使用示例: fe lan ./src/views [replace或r] [noOutput或n] getEn 把 “中文”: “English” 转成 “English”: “English”, 使用示例: fe getEn src/langs/en.json -h, —help display help for command

终端输入:fe mock
会执行mock部分的脚本,切换到mock模式

  1. <a name="0ce29b70"></a>
  2. ## 如何搭建一个这样的前端工具平台呢?
  3. 先列大纲,下面会细讲
  4. 1. 用内部gitlab管理代码(没有的话,公网github或gitee也可以)
  5. 1. 需要内部npm域(没有的话,公网npm也可以)
  6. - 作用:让小组其他成员可以方便下载(npm install -g xx),其次,可以很方便的管理版本
  7. 3. 配置package.json
  8. 3. 配置入口文件main.js
  9. 3. 发布到内部npm域
  10. 3. 开发脚本过程中的测试?
  11. <a name="d73e355d"></a>
  12. ## 1. 用内部gitlab管理代码(没有的话,公网github或gitee也可以)
  13. 基本的git操作,相信大家都会,略过
  14. <a name="d85e0874"></a>
  15. ## 2. 需要内部npm域(没有的话,公网npm也可以)
  16. 跟着下面第5点(5. 发布到内部npm域)一起讲
  17. <a name="fe4f0b02"></a>
  18. ## 3. 配置package.json
  19. ```json
  20. {
  21. "name": "@myCompany/fe",
  22. "version": "1.0.51",
  23. "description": "前端工具平台",
  24. "scripts": {
  25. "dev": "node bin/main.js",
  26. "p": "node utils/publish.js && lnpm publish && npm i -g @myCompany/fe"
  27. },
  28. "author": "bigtree",
  29. "license": "ISC",
  30. "dependencies": {
  31. },
  32. "devDependencies": {
  33. },
  34. "bin": { // 其他的字段,相信大家都比较熟悉, 此处最重要的要讲的是bin字段
  35. "fe": "./bin/main.js" // 注意此处的"./bin/main.js",指向了目录(文件目录结构在下方)内的main.js文件
  36. }
  37. }
  38. // 其他的字段,相信大家都比较熟悉, 此处最重要的要讲的是bin字段
  39. - 为了要实现:终端输入:fe 能打印xxx 执行脚本,需要配置bin
  40. // 参考eslint的源码内的package.json
  41. "bin": {
  42. "eslint": "./bin/eslint.js" // bin的对象的key,能作为类似node一样,作为全局环境变量被解析。实际上也是node来触发
  43. },
  44. 文件的目录结构
  45. @myCompany-fe
  46. bin
  47. main.js
  48. .gitignore
  49. package.json
  50. package-lock.json
  51. README.md
  1. // 终端执行效果 如下,fe会被加入node的全局变量池中
  2. xxx-MacBook-Pro / % npm i -g @myCompany/fe
  3. xxx-MacBook-Pro / % where fe
  4. /Users/xxx/.nvm/versions/node/v12.21.0/bin/fe
  5. xxx-MacBook-Pro bin % cd /Users/xxx/.nvm/versions/node/v12.21.0/bin
  6. xxx-MacBook-Pro bin % ls
  7. fe eslint http-server node npm
  8. npx stylelint

安装: npm i -g @myCompany/fe (需发布,如何发布在第5点(5. 发布到内部npm域)还未讲 )

最终终端输入:fe, 就会执行 @myCompany-fe/bin/main.js

4. 配置入口文件main.js

  1. #! /usr/bin/env node
  2. // 上面是配置当前的环境变量地址: mac上是固定的
  3. /* 文件说明:
  4. * 命令的入口文件
  5. */
  6. const commander = require('commander') // 让命令生效, 如: fe -h
  7. const Chalk = require('chalk')
  8. const path = require('path')
  9. const pkgJson = require('../package.json')
  10. const { exec } = require('child_process') // 执行命令行 如: node a.js
  11. const autoRouteAndFile = require('./autoRouteAndFile/entry.js') // 其他脚本文件
  12. const autoApiAndMock = require('./autoApiAndMock/entry.js') // 其他脚本文件
  13. const autoFileRoute = require('./autoFileRoute/entry.js') // 其他脚本文件
  14. // 定义版本号以及命令选项
  15. commander
  16. .version(pkgJson.version, '-v -V --version') // 不写后面这个的话,只能用大写的 -V
  17. .option('cli', '脚手架拉取内部模板')
  18. .option('mock', '切换到mock模式. 根据fe.config.js内的apiAndMock对象')
  19. .option('api', '正常模式: 从mock模式切换到api模式. 根据fe.config.js内的apiAndMock对象')
  20. .option('api-pkg', 'pkg模式: 切换到api模式, 且把响应的返回值在包一层, 简化输出. 根据fe.config.js内的apiAndMock对象')
  21. .option('route', '根据fe.config.js内的route对象, 自动生成./route/routes.js 和 路由对应的 .vue文件(./src/components内), ')
  22. .option('file-route', '根据传入的参数监听目录(默认监听 components 目录),当文件发生变化时自动生成 ./route/routes.js 文件。(eg: fe file-route views 监听 views 目录)')
  23. .option('lan', '中文提词及回填工具, 使用示例: fe lan ./src/views [replace或r] [noOutput或n]')
  24. .option('getEn', '把 "中文": "English" 转成 "English": "English", 使用示例: fe getEn src/langs/en.json')
  25. .parse(process.argv) // let commander can get process.argv
  26. // 配置文件的绝对路径 (当前命令执行的路径)
  27. const configPath = path.join(process.cwd(), 'fe.config.js')
  28. console.log('读取配置文件的路径是: ' + configPath)
  29. // get ./fe.config.js
  30. const getConfig = (key) => {
  31. let Config = null
  32. try {
  33. Config = require(configPath)
  34. } catch (e) {
  35. console.log(Chalk.red('error: 使用此命令,必须先配置fe.config.js'))
  36. console.error(Chalk.red(e))
  37. }
  38. if (Object.prototype.toString.call(Config) === '[object Object]') {
  39. if (!key) {
  40. return Config
  41. } else {
  42. if (Config[key]) {
  43. console.log(Chalk.green('读取配置文件成功!'))
  44. return Config[key]
  45. } else {
  46. console.log(Chalk.red(`请配置fe.config.js里面的 ${key} 配置项`))
  47. }
  48. }
  49. } else {
  50. console.error(Chalk.red('请正确配置fe.config.js'))
  51. }
  52. }
  53. // main
  54. const main = () => {
  55. if (commander.args.length === 0) { // 当直接输入fe 时
  56. const realPath = path.join(__dirname, 'main.js')
  57. exec(`node ${realPath} -h`, (err, stdout, stderr) => {
  58. if (err) console.error(Chalk.red(err))
  59. console.log(`欢迎使用前端工具平台, 使用示例: fe mock \n${stdout}`)
  60. })
  61. } else { // 当输入fe xx 时
  62. const cmd = commander.args[0]
  63. if (['mock', 'api', 'api-pkg'].includes(cmd)) {
  64. autoApiAndMock(getConfig('apiAndMock'))
  65. } else if (cmd === 'route') {
  66. autoRouteAndFile(getConfig('route'))
  67. } else if (cmd === 'file-route') {
  68. autoFileRoute(getConfig('fileRoute'))
  69. } else if (cmd === 'lan') {
  70. require('./lan/lan-script.js')
  71. console.log('do something...')
  72. } else if (cmd === 'getEn') {
  73. require('./lan/getIndia.js')
  74. }
  75. }
  76. }
  77. main()

5. 发布到内部npm域

打开控制台,输入以下指令

  • 如果你是第一次发包,使用 npm adduser
  • 如果不是第一次发, 使用 npm login

紧接着出现,输入账号名字,密码,邮箱

  1. username:xxx
  2. password:
  3. Email:xxx@xxx.com

在项目的根目录下,与 package.json 同级的目录

  • 输入 npm publish , 发布

然后你就可以在 内部npm域或公网npm域 里面找到自己的刚刚发布的包了

6. 开发脚本过程中的测试?

  1. 小脚本
    • 可以直接copy文件到测试项目内,直接test
    • 缺点:因为是手动copy的,所以写相对路径的话,可能不准,可以用path.resolve()解析成绝对路径
  1. 通用方法(不手动copy,就在源文件内)
    1. npm link : https://docs.npmjs.com/cli/v7/commands/npm-link
    2. 用编辑器拿到main.js绝对路径,然后就可以直接执行
      absolutePath.png


例如: /Users/xxx/Desktop/project/xxx/bin/main.js (效果和执行 fe 一样)

需要打debugger的话:

在当前的项目内的根目录下,输入
node —inspect-brk bin/main.js,就可以启动调试模式