成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

如何自己搭一個(gè)腳手架

jlanglang / 1799人閱讀

摘要:二賬號(hào)注冊(cè)賬號(hào)登錄添加用戶(hù)信息到注冊(cè)表主體內(nèi)容寫(xiě)代碼準(zhǔn)備工作做齊了,開(kāi)始打開(kāi)終端,初始化項(xiàng)目這個(gè)是一個(gè)簡(jiǎn)單的腳手架張?chǎng)芜@個(gè)是一個(gè)簡(jiǎn)單的腳手架張?chǎng)雾?xiàng)目的結(jié)構(gòu)就基本出來(lái)了。

前言
做前端也有三四年了,自己帶了個(gè)五人前端小團(tuán)隊(duì),第一次寫(xiě)腳手架,也是第一次寫(xiě)分享文章。文筆太差,勿噴、勿噴、勿噴    
每次人肉搬運(yùn)代碼的時(shí)候,就想自己能不能給團(tuán)隊(duì)做一個(gè)跟vue-cli一樣的腳手架?想了很久,苦于各種原因一直沒(méi)有實(shí)施。
正好最近不忙,此時(shí)不搞,更待何時(shí)!開(kāi)搞,網(wǎng)上查文檔,gitHub扒vue-cli的源碼,坑哧吭哧的搗鼓了兩天……成了。拿出來(lái)分享一下吧。

準(zhǔn)備工作 一、gitHub新建組織和倉(cāng)庫(kù)

這個(gè)不難,一張圖概括,按照提示步驟填寫(xiě)信息就好了。如下圖,我創(chuàng)建了一個(gè)叫template-organization的組織。

組織創(chuàng)建完之后,就可以在template-organization這個(gè)組織下創(chuàng)建新的倉(cāng)庫(kù)demo-template

重點(diǎn)來(lái)了,https://api.github.com/users/...,獲取template-organization這個(gè)組織下的所有倉(cāng)庫(kù)信息。

二、npm賬號(hào)
** 注冊(cè)賬號(hào):** 
    [https://www.npmjs.com/][2]
** 登錄: ** 
    npm login
** 添加用戶(hù)信息到注冊(cè)表 ** 
    npm adduser
主體內(nèi)容 寫(xiě)代碼

準(zhǔn)備工作做齊了,開(kāi)始coding……

 打開(kāi)終端,初始化項(xiàng)目 
$ `mkdir edu-test-cli`
$ `cd edu-test-cli/`
$ `npm init`
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.

See `npm help json` for definitive documentation on these fields
and exactly what they do.

Use `npm install ` afterwards to install a package and
save it as a dependency in the package.json file.

Press ^C at any time to quit.
package name: (edu-test-cli) 
version: (1.0.0) 
description: 這個(gè)是一個(gè)簡(jiǎn)單的腳手架
entry point: (index.js) 
test command: 
git repository: 
keywords: cli edu zhx
author: 張?chǎng)?license: (ISC) MIT
About to write to /Users/zhangxin/study/edu-test-cli/package.json:

{
  "name": "edu-test-cli",
  "version": "1.0.0",
  "description": "這個(gè)是一個(gè)簡(jiǎn)單的腳手架",
  "main": "index.js",
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "keywords": [
    "cli",
    "edu",
    "zhx"
  ],
  "author": "張?chǎng)?,
  "license": "MIT"
}


Is this ok? (yes) yes

項(xiàng)目的package.json結(jié)構(gòu)就基本出來(lái)了。

 加入依賴(lài)的包 
npm i chalk commander download-git-repo inquirer ora request --save
 修改package.json中配置,如下 
{
  "name": "edu-test-cli",
  "version": "1.0.0",
  "description": "這個(gè)是一個(gè)簡(jiǎn)單的腳手架",
  "preferGlobal": true,
  "bin": {
    "edu": "bin/edu"
  },
  "dependencies": {
    "chalk": "^1.1.3",
    "commander": "^2.9.0",
    "download-git-repo": "^1.1.0",
    "inquirer": "^6.2.0",
    "ora": "^3.0.0",
    "request": "^2.88.0"
  },
  "scripts": {
    "test": "echo "Error: no test specified" && exit 1"
  },
  "keywords": [
    "cli",
    "edu",
    "zhx"
  ],
  "author": "張?chǎng)?,
  "license": "MIT"
}
 項(xiàng)目結(jié)構(gòu),如下 
>edu-test-cli
    |--bin
       |--edu
    |--lib
       |--list.js
       |--init.js
    |--package.json
    |--README.md
在bin目錄下新建 edu (沒(méi)有后綴),代碼如下
#!/usr/bin/env node
process.env.NODE_PATH = __dirname + "/../node_modules/"

const program = require("commander")

program
  .version(require("../package.json").version)
  .usage(" [options]")
program
  .command("list")
  .description("查看所有的模版")
  .alias("l")
  .action(() => {
    require("../lib/list")()
  })
program
  .command("init")
  .description("生成一個(gè)新項(xiàng)目")
  .alias("i")
  .action(() => {
    require("../lib/init")()
  })
program
  .parse(process.argv)

if(!program.args.length){
  program.help()
}
lib目錄下 init.js,代碼如下
const ora = require("ora")
const inquirer = require("inquirer")
const chalk = require("chalk")
const request = require("request")
const download = require("download-git-repo")

module.exports = () => {
  request({
    url: "https://api.github.com/users/template-organization/repos",
    headers: {
      "User-Agent": "edu-test-cli"
    }
  }, (err, res, body) =>{
    if (err) {
      console.log(chalk.red("查詢(xún)模版列表失敗"))
      console.log(chalk.red(err))
      process.exit();
    }

    const requestBody = JSON.parse(body)
    if (Array.isArray(requestBody)) {
      let tplNames = [];
      requestBody.forEach(repo => {
        tplNames.push(repo.name);
      })

      let promptList = [
        {
          type: "list",
          message: "請(qǐng)選擇模版",
          name: "tplName",
          choices: tplNames
        },
        {
          type: "input",
          message: "請(qǐng)輸入項(xiàng)目名字",
          name: "projectName",
          validate (val) {
            if (val !== "") {
              return true
            }
            return "項(xiàng)目名稱(chēng)不能為空"
          }
        }
      ]
      inquirer.prompt(promptList).then(answers => {

        let ind = requestBody.find(function (ele) {
          return answers.tplName == ele.name;
        });
        let gitUrl = `${ind.full_name}#${ind.default_branch}`,
          defaultUrl = "./",
          projectUrl = `${defaultUrl}/${answers.projectName}`,
          spinner = ora("
 開(kāi)始生成項(xiàng)目,請(qǐng)等待...");
          spinner.start();
        download(gitUrl, projectUrl, (error)=>{
          spinner.stop();
          if (error) {
            console.log("模版下載失敗……")
            console.log(error)
            process.exit()
          }
          console.log(chalk.green(`
 √ ${answers.projectName} 項(xiàng)目生成完畢!`))
          console.log(`
 cd ${answers.projectName} && npm install 
`)
        })
      })
    } else {
      console.error(requestBody.message)
    }
  })
}
lib目錄下的 list.js,代碼如下:
const request = require("request");
const chalk = require("chalk")
const ora = require("ora")
module.exports = () => {
  let spinner = ora("
 " + chalk.yellow("正在查詢(xún)模版列表,請(qǐng)等待..."));
  spinner.start();
  request({
    url: "https://api.github.com/users/template-organization/repos",
    headers: {
      "User-Agent": "edu-test-cli"
    }
  }, (err, res, body) => {
    spinner.stop();
    if (err) {
      console.log(chalk.red("查詢(xún)模版列表失敗"))
      console.log(chalk.red(err))
      process.exit();
    }
    const requestBody = JSON.parse(body)
    if (Array.isArray(requestBody)) {
      console.log()
      console.log(chalk.green("可用的模版列表:"))
      console.log()
      requestBody.forEach(repo => {
        console.log(
        "  " + chalk.yellow("★") +
        "  " + chalk.blue(repo.name) +
        " - " + repo.description)
      })
    } else {
      console.error(requestBody.message)
    }
  })
}

到這里這個(gè)簡(jiǎn)單的腳手架就開(kāi)發(fā)完了。代碼都在這里,是不是很簡(jiǎn)單呢?

開(kāi)發(fā)、測(cè)試、發(fā)布
 開(kāi)發(fā)時(shí),可使用以下命令查看效果 
node bin/edu list   查看所有可用的模版
node bin/edu init   把模版下載下來(lái),作為初始項(xiàng)目進(jìn)行開(kāi)發(fā)
測(cè)試時(shí),如何使用全局的 edu list/init 的命令呢?
npm link    ///只能自己本地使用。
 開(kāi)發(fā)、測(cè)試完成,發(fā)布 
npm publish  ///將包發(fā)布到npm上,所有人都可以安裝使用。

例子:
edu-test-cli> $ npm publish
+ [email protected]
使用方法
 安裝 
npm install -g edu-test-cli
 查看模版列表 
$ edu list

可用的模版列表:

  ★  demo-template - 這是一個(gè)關(guān)于移動(dòng)端適配方案的示例項(xiàng)目。
 創(chuàng)建項(xiàng)目 
$ edu init
? 請(qǐng)選擇模版 (Use arrow keys)
? demo-template 
  
? 請(qǐng)輸入項(xiàng)目名字
結(jié)尾

終于寫(xiě)完了。寫(xiě)文章比寫(xiě)代碼還累。。。。。。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/99233.html

相關(guān)文章

  • 如何構(gòu)建大型的前端項(xiàng)目

    摘要:如何構(gòu)建大型的前端項(xiàng)目搭建好項(xiàng)目的腳手架一般新開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),我們會(huì)首先搭建好一個(gè)腳手架,然后才會(huì)開(kāi)始寫(xiě)代碼。組件化一般分為項(xiàng)目?jī)?nèi)的組件化和項(xiàng)目外的組件化。 如何構(gòu)建大型的前端項(xiàng)目 1. 搭建好項(xiàng)目的腳手架 一般新開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),我們會(huì)首先搭建好一個(gè)腳手架,然后才會(huì)開(kāi)始寫(xiě)代碼。一般腳手架都應(yīng)當(dāng)有以下的幾個(gè)功能: 自動(dòng)化構(gòu)建代碼,比如打包、壓縮、上傳等功能 本地開(kāi)發(fā)與調(diào)試,并有熱替換與...

    lykops 評(píng)論0 收藏0
  • 如何構(gòu)建大型的前端項(xiàng)目

    摘要:如何構(gòu)建大型的前端項(xiàng)目搭建好項(xiàng)目的腳手架一般新開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),我們會(huì)首先搭建好一個(gè)腳手架,然后才會(huì)開(kāi)始寫(xiě)代碼。組件化一般分為項(xiàng)目?jī)?nèi)的組件化和項(xiàng)目外的組件化。 如何構(gòu)建大型的前端項(xiàng)目 1. 搭建好項(xiàng)目的腳手架 一般新開(kāi)發(fā)一個(gè)項(xiàng)目時(shí),我們會(huì)首先搭建好一個(gè)腳手架,然后才會(huì)開(kāi)始寫(xiě)代碼。一般腳手架都應(yīng)當(dāng)有以下的幾個(gè)功能: 自動(dòng)化構(gòu)建代碼,比如打包、壓縮、上傳等功能 本地開(kāi)發(fā)與調(diào)試,并有熱替換與...

    plokmju88 評(píng)論0 收藏0
  • ELSE 技術(shù)周刊(2017.11.20期)

    摘要:業(yè)界動(dòng)態(tài)發(fā)布重大更新,新版本建立在一個(gè)全新的的引擎之上,速度是個(gè)月前的兩倍。值得一提的是,該特性并未加到中,而是作為單獨(dú)依賴(lài)包。過(guò)濾繞過(guò)速查表本篇文章的主要目的是給專(zhuān)業(yè)安全測(cè)試人員提供一份跨站腳本漏洞檢測(cè)指南。預(yù)計(jì)閱讀時(shí)間分鐘。 業(yè)界動(dòng)態(tài) Introducing the New Firefox: Firefox Quantum FireFox 發(fā)布重大更新,新版本建立在一個(gè)全新的的引擎...

    mindwind 評(píng)論0 收藏0
  • 前端之從零開(kāi)始系列

    摘要:只有動(dòng)手,你才能真的理解作者的構(gòu)思的巧妙只有動(dòng)手,你才能真正掌握一門(mén)技術(shù)持續(xù)更新中項(xiàng)目地址求求求源碼系列跟一起學(xué)如何寫(xiě)函數(shù)庫(kù)中高級(jí)前端面試手寫(xiě)代碼無(wú)敵秘籍如何用不到行代碼寫(xiě)一款屬于自己的類(lèi)庫(kù)原理講解實(shí)現(xiàn)一個(gè)對(duì)象遵循規(guī)范實(shí)戰(zhàn)手摸手,帶你用擼 Do it yourself!!! 只有動(dòng)手,你才能真的理解作者的構(gòu)思的巧妙 只有動(dòng)手,你才能真正掌握一門(mén)技術(shù) 持續(xù)更新中…… 項(xiàng)目地址 https...

    Youngdze 評(píng)論0 收藏0
  • 從 0 到 1 再到 100, 建、編寫(xiě)、構(gòu)建一個(gè)前端項(xiàng)目

    摘要:從到再到搭建編寫(xiě)構(gòu)建一個(gè)前端項(xiàng)目選擇現(xiàn)成的項(xiàng)目模板還是自己搭建項(xiàng)目骨架搭建一個(gè)前端項(xiàng)目的方式有兩種選擇現(xiàn)成的項(xiàng)目模板自己搭建項(xiàng)目骨架。使用版本控制系統(tǒng)管理源代碼項(xiàng)目搭建好后,需要一個(gè)版本控制系統(tǒng)來(lái)管理源代碼。 從 0 到 1 再到 100, 搭建、編寫(xiě)、構(gòu)建一個(gè)前端項(xiàng)目 1. 選擇現(xiàn)成的項(xiàng)目模板還是自己搭建項(xiàng)目骨架 搭建一個(gè)前端項(xiàng)目的方式有兩種:選擇現(xiàn)成的項(xiàng)目模板、自己搭建項(xiàng)目骨架。 ...

    call_me_R 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<