前端工程化(一)

  • 背景:

以前刀耕火種的年代


以前的前端.png
  • 問(wèn)題/解決方案
問(wèn)題分類.png
  • 代碼不夠健壯含蓉,可讀性差,沒(méi)有智能提示霸褒,使用 TypeScript,提高代碼質(zhì)量盈蛮,智能提示讓我們更加方便快捷

  • 多人開發(fā)废菱,風(fēng)格不夠統(tǒng)一,質(zhì)量層次不齊抖誉,可以使用一些編碼規(guī)范檢查的工具殊轴,使得項(xiàng)目代碼風(fēng)格統(tǒng)一,質(zhì)量得到保證

  • Mock.js 這樣的插件完成假數(shù)據(jù)的編寫袒炉,開發(fā)階段時(shí)旁理,讓前端可以不依賴后端接口去完成相應(yīng)工作

  • 想使用ES6+新特性,但是兼容有問(wèn)題我磁,借助babel

  • 想使用Less/Sass/PostCss增強(qiáng)Css的編程性孽文,借助一些編譯工具

  • 部署上線前需要手動(dòng)壓縮代碼以及資源文件驻襟,部署過(guò)程需要手動(dòng)上傳代碼到服務(wù)器 創(chuàng)建自己的自動(dòng)化構(gòu)建工作流,持續(xù)集成芋哭,自動(dòng)發(fā)布

概念

前端工程化是指遵循一定的規(guī)范和標(biāo)準(zhǔn)沉衣,通過(guò)工具去降低成本,提高效率的手段减牺。一切以提高效率豌习,保證質(zhì)量,降低成本為目的的手段都屬于工程化

工程化 != 工具

工程化是對(duì)我們整體項(xiàng)目的規(guī)劃和架構(gòu) 工具只是幫我們?nèi)?shí)現(xiàn)這種規(guī)劃的一種手段
creat-react-app vue-cli 是集成式的工程化方案拔疚,并不是單純的腳手架
不僅創(chuàng)建的項(xiàng)目斑鸦,約定了項(xiàng)目應(yīng)該是什么樣的結(jié)構(gòu)
提供了熱更新開發(fā)服務(wù),自動(dòng)編譯 vue 的單文件組件草雕,代碼分格的校驗(yàn)

工程化應(yīng)該歸功于 node,由 node 強(qiáng)力驅(qū)動(dòng)

四個(gè)維度實(shí)現(xiàn):

  • 模塊化

    • es6 export import 社區(qū)制定了一些模塊加載方案 CommonJS、AMD 和 CMD
    • css 的模塊化 @import, css in js,css module
    • 資源的模塊化 webpack 一切皆模塊
  • 組件化

    • 模塊化是文件層面上的固以,對(duì)代碼資源的拆分墩虹。而組件化是設(shè)計(jì)層面的,對(duì) UI 的拆封
    • 組件化更重要是一種分治思想
    • 組件化實(shí)現(xiàn)工程化用的工具就是 react,vue
  • 規(guī)范化

    • 目錄結(jié)構(gòu)的制定
      • 有助于提高項(xiàng)目的邏輯結(jié)構(gòu)的合理性
      • 對(duì)應(yīng)擴(kuò)展和合作
      • 快速的資源定位
    • js 規(guī)范
      • 統(tǒng)一語(yǔ)法 用 hooks 就大家一起用 不要一會(huì)類組件一會(huì)函數(shù)組件
      • eslint 統(tǒng)一在項(xiàng)目根目錄約定
      • 格式化工具 -prettier
    • 前后端接口的規(guī)范
      • 接口文檔 一步到位各擼各的
      • 接口返回?cái)?shù)據(jù)即顯示憨琳,前端僅做渲染邏輯處理
      • 渲染邏輯禁止跨多個(gè)接口調(diào)用
      • 前端關(guān)注交互诫钓、渲染邏輯,盡量避免業(yè)務(wù)邏輯處理的出現(xiàn)
      • 請(qǐng)求響應(yīng)傳輸數(shù)據(jù)格式:JSON篙螟,JSON 數(shù)據(jù)盡量簡(jiǎn)單輕量菌湃,避免多級(jí) JSON 的出現(xiàn);
      • 定好通用的數(shù)據(jù)返回格式遍略,以及狀態(tài)值的規(guī)范
      • 日期類型惧所,JSON 數(shù)據(jù)傳輸中一律使用字符串,具體日期格式統(tǒng)一 utc
  • 自動(dòng)化

任何簡(jiǎn)單機(jī)械的重復(fù)勞動(dòng)都應(yīng)該讓機(jī)器去完成绪杏。

  • 三個(gè)方面
    • 項(xiàng)目腳手架幫我們自動(dòng)搭建初始項(xiàng)目結(jié)構(gòu)下愈,提供基礎(chǔ)模板,規(guī)范結(jié)構(gòu)蕾久,等
    • 項(xiàng)目開發(fā)中實(shí)現(xiàn)熱加載势似,源代碼的變動(dòng)自動(dòng)響應(yīng)瀏覽器
    • 項(xiàng)目自動(dòng)化構(gòu)建,自動(dòng)化部署 持續(xù)集成 自動(dòng)化測(cè)試

具體落實(shí)前端工程化

  • 腳手架開發(fā)
  • 自動(dòng)化構(gòu)建系統(tǒng)
  • 模塊化打包
  • 項(xiàng)目代碼規(guī)范化
  • 自動(dòng)化部署

腳手架工具

創(chuàng)建基礎(chǔ)項(xiàng)目結(jié)構(gòu)僧著,提供項(xiàng)目規(guī)范和約定

  • 保證相同的組織結(jié)構(gòu) 相同的開發(fā)范式 相同的模塊依賴
    相同的工具配置 相同的基礎(chǔ)代碼

  • 沒(méi)有腳手架我們會(huì)有大量的基礎(chǔ)工作去做

  • 團(tuán)隊(duì)成員對(duì)同一個(gè)腳手架新建的不同的工程都可以去維護(hù)修改添加需求履因,保證了成員靈活性和可調(diào)配性。

常用腳手架

React => create-react-app
vue => vue-cli
angular => angular-cli
yeoman 通用型腳手架工具
Plop 創(chuàng)建特定類型文件

腳手架的實(shí)現(xiàn)過(guò)程

  • 腳手架工具其實(shí)就是個(gè) nodecli 應(yīng)用盹愚,創(chuàng)建腳手架過(guò)程就是創(chuàng)建 cli 應(yīng)用的過(guò)程

  • 通過(guò)命令行交互詢問(wèn)用戶問(wèn)題栅迄;

  • 根據(jù)用戶回答的結(jié)果,再結(jié)合一些模板文件杯拐,最后生成項(xiàng)目結(jié)構(gòu)霞篡。

  • 實(shí)現(xiàn)過(guò)程

  • 創(chuàng)建一個(gè)文件

mkdir my-cli
  • 初始化 package.json
yarn init
  • 在 package.json 中添加 bin 字段,指定 cli 的入口文件
"bin":"cli.js"
  • 添加 cli.js

  • cli 文件必須有特定操作頭(如果是 Linux 或者 macOS 系統(tǒng)的話還需要修改此文件的讀寫權(quán)限為 755)

$ chmod 755 cli.js
#!usr/bin/env node
console.log('glh')
yarn link
my-cli

執(zhí)行完再終端就會(huì)看到打印結(jié)果為 glh

要通過(guò)命令行詢問(wèn)用戶世蔗、需要安裝 inqurier

yarn add inquirer

根據(jù)用戶輸入動(dòng)態(tài)生成文件

const inquirer = require('inquirer');
const path = require('path');
const fs = require('fs');
const ejs = require('ejs');
inquirer
  .prompt([
    {
      type: 'input',
      name: 'name',
      message: 'Preject name',
    },
  ])
  .then(anwsers => {
    // 模板目錄
    const templDir = path.join(__dirname, 'templetes');

    // 目標(biāo)路徑
    const destDir = process.cwd();

    fs.readdir(templDir, (err, files) => {
      if (err) throw err;
      files.forEach(file => {
        ejs.renderFile(path.join(templDir, file),  anwsers, (err, result) => {
          if (err) throw err;
          fs.writeFileSync(path.join(destDir, file), result);
        });
      });
    });
  });

上面過(guò)程大致意思就是在腳手架根目錄創(chuàng)建一個(gè) templetes 目錄,用來(lái)存放我們的模板文件朗兵,然后根據(jù)用戶輸入污淋,通過(guò) ejs 模板引擎的 renderFile 方法把我們的用戶輸入結(jié)果和模板相結(jié)合,輸出到我們腳手架使用時(shí)候文件的根目錄

自動(dòng)化構(gòu)建

一切重復(fù)的工作都應(yīng)該自動(dòng)化余掖,將我們生產(chǎn)環(huán)境的源代碼寸爆,轉(zhuǎn)化為生產(chǎn)環(huán)境可以運(yùn)行的代碼或者程序,我們把這樣一個(gè)過(guò)程稱之為自動(dòng)化構(gòu)建工作流盐欺。這樣的作用就脫離運(yùn)行環(huán)境帶來(lái)的兼容問(wèn)題赁豆,在開發(fā)階段使用一些提高效率的語(yǔ)法,規(guī)范和標(biāo)準(zhǔn)

  • NPM Script 是實(shí)現(xiàn)自動(dòng)化構(gòu)建工作流的最簡(jiǎn)單的方式

  • 常見(jiàn)的自動(dòng)化構(gòu)建工具


    構(gòu)建工具

Gulp

使用注意事項(xiàng)

  • gulp默認(rèn)創(chuàng)建的任務(wù)為異步任務(wù)冗美,如果我們?cè)谌蝿?wù)中寫同步代碼必須傳入回調(diào)函數(shù)指定任務(wù)結(jié)束
// 4.0版本以上
exports.foo = done = {
  console.log('同步代碼')
  done()
}
  • 任務(wù)組合
const { series, parallel } require('gulp')
// 串行模式
exports.foo = series(task1, task2)
// 并行模式
exports.foo = parallel(task1, task2)
  • gulp的工作原理
    The streaming build system
const fs = require('fs');
const { Transform } = require('stream');
exports.default = () => {
  const read = fs.createReadStream('index.js');
  const write = fs.createWriteStream('index.js');
  const transform = new Transform({
    transfor: (chunk, encoding, callback) => {
      const input = chunk.toString();
      const output = input.replace(/\s+/g, '').replace(/\/\*.+?\*\//g, '');
      callback(null, output);
    },
  });
  read.pipe(transform).pipe(write);
  return read;
};
  • 讀取流
  • 轉(zhuǎn)換流
  • 寫入流
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魔种,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子粉洼,更是在濱河造成了極大的恐慌节预,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件属韧,死亡現(xiàn)場(chǎng)離奇詭異安拟,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)宵喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門糠赦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人锅棕,你說(shuō)我怎么就攤上這事拙泽。” “怎么了裸燎?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵奔滑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我顺少,道長(zhǎng)朋其,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任脆炎,我火速辦了婚禮梅猿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘秒裕。我一直安慰自己袱蚓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布几蜻。 她就那樣靜靜地躺著喇潘,像睡著了一般体斩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上颖低,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天絮吵,我揣著相機(jī)與錄音,去河邊找鬼忱屑。 笑死蹬敲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的莺戒。 我是一名探鬼主播伴嗡,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼从铲!你這毒婦竟也來(lái)了瘪校?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤名段,失蹤者是張志新(化名)和其女友劉穎渣淤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吉嫩,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年嗅定,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了自娩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡渠退,死狀恐怖忙迁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碎乃,我是刑警寧澤姊扔,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站梅誓,受9級(jí)特大地震影響恰梢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梗掰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一嵌言、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧及穗,春花似錦摧茴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)娃豹。三九已至,卻和暖如春购裙,著一層夾襖步出監(jiān)牢的瞬間懂版,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工缓窜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留定续,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓禾锤,卻偏偏與公主長(zhǎng)得像私股,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子恩掷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345