成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

前端工程化/構(gòu)建自動(dòng)化

JasonZhang / 3399人閱讀

摘要:前端工程化的演化。前端較為流行的單元測(cè)試,等自動(dòng)化測(cè)試自動(dòng)化測(cè)試是軟件通過(guò)模擬瀏覽器,對(duì)頁(yè)面進(jìn)行操作,判斷是否產(chǎn)生預(yù)想的效果。

前端工程化

??前端工程化的概念在近些年來(lái)逐漸成為主流構(gòu)建大型web應(yīng)用不可或缺的一部分,在此我通過(guò)以下這三方面總結(jié)一下自己的理解。

為什么需要前端工程化。

前端工程化的演化。

怎么實(shí)現(xiàn)前端工程化。

為什么需要工程化

??隨著近些年來(lái)前端技術(shù)的不斷發(fā)展,越來(lái)越多復(fù)雜的業(yè)務(wù)放在了前端,前端不再是以前幾個(gè)HTML + CSS + javascript就能解決的了。業(yè)務(wù)復(fù)雜了,需要維護(hù)的代碼量就自然多了,如此一來(lái),前端代碼的可靠性,可維護(hù)性,可拓展性,以及前端web應(yīng)用的性能,開(kāi)發(fā)效率等等各方面就成了不得不考慮的問(wèn)題。

??于是我們就產(chǎn)生了前端工程化這個(gè)概念,來(lái)解決這些問(wèn)題?,F(xiàn)階段的前端工程化,需要考慮到各個(gè)方面,包括但不限于以下這幾點(diǎn):

提升開(kāi)發(fā)效率

webpack-dev-server 熱加載
  以前,我們的日常前端開(kāi)發(fā)的流程是這樣的: 修改代碼 -> 切換IDE到瀏覽器 -> 刷新瀏覽器查看效果(有時(shí)候還需要清除緩存) -> 修改代碼 ....。

  這套流程,尤其是刷新瀏覽器這個(gè)過(guò)程,無(wú)疑是相當(dāng)低效繁瑣枯燥的。 而webpack-dev-server 替我們解決了這個(gè)問(wèn)題,它有兩種模式,兩種模式,一種是 watch 模式,功能是你修改代碼,自動(dòng)幫你刷新頁(yè)面,無(wú)需手動(dòng)刷新;另一種更加強(qiáng)大,基于 websocket 全雙工通信技術(shù),直接無(wú)刷新幫你把修改的代碼替換掉。 從而極大程度上提高了開(kāi)發(fā)效率。

數(shù)據(jù)mock
  在后端接口還沒(méi)提供的時(shí)候,前后端制定好共同的接口協(xié)議,開(kāi)發(fā)時(shí)前端可以使用mock模擬數(shù)據(jù),與后端徹底分離,并行開(kāi)發(fā)。面向接口編程,盡可能減少前后端溝通成本。

優(yōu)化性能

代碼合并壓縮,混淆加密

減少小圖片請(qǐng)求
  webpack中url-loader:loader: "url-loader?limit=8192",使得小于8kb的圖片使用data:image base64 編碼內(nèi)聯(lián),減少圖片請(qǐng)求量

部署靜態(tài)文件緩存管理
  使用webpack的內(nèi)置的chunkhash功能,可以給生成的js文件添加hash后綴,標(biāo)識(shí)文件版本。

提高代碼質(zhì)量

模塊化
  主要指 js 代碼的模塊化。以前的前端開(kāi)發(fā)并沒(méi)有模塊化這個(gè)概念,這給維護(hù)大型項(xiàng)目帶來(lái)了極大的困難。發(fā)展到現(xiàn)在的前端有很多模塊化的方法可供選擇,如seajs ,requirejs, webpack 等。 模塊化能很大程度上提高了代碼的可維護(hù)性。

CSS 預(yù)處理
  通過(guò)sass,less 等css 預(yù)處理器,可以實(shí)現(xiàn) css 文件的拆分,顆粒化,實(shí)現(xiàn)css可復(fù)用。而且通過(guò)autoprefixer或postcss 還可以讓 css 樣式對(duì)老舊瀏覽器向下兼容。

  此外,通過(guò)使用 css-modules 能夠避免css全局污染的問(wèn)題,極大提高css代碼的可控性,不需要設(shè)定一堆命名空間與命名規(guī)范來(lái)限制。

ES6 + babel 編譯
  javascript本身設(shè)計(jì)存在一定程度上的缺陷,例如“沒(méi)有模塊化”,“沒(méi)有塊級(jí)作用域”,“全局變量污染”,“回調(diào)地獄”等等之類(lèi)的問(wèn)題,為了改善這些缺陷,計(jì)算機(jī)協(xié)會(huì)在2015年推出了ECMAScript 6 標(biāo)準(zhǔn)(今年已經(jīng)ES8 已經(jīng)發(fā)布了),使用ES6的語(yǔ)法除了能有效減少代碼量之外,還引入了塊級(jí)作用域,模塊化,類(lèi)的語(yǔ)法糖,promise以及一些新的API,很大程度上填了以前javascript的遺留下的坑,以及提高了代碼質(zhì)量。

  不過(guò)即便過(guò)了兩年,ES6也并沒(méi)有被市面的主流瀏覽器完全支持,所以我們還需用 babel 將ES6 編譯成ES5,再將一些不支持的API polyfill 處理。

eslint 代碼檢查
  一直一來(lái),代碼風(fēng)格都是一場(chǎng)無(wú)休止的爭(zhēng)論,每個(gè)人都有自己的代碼風(fēng)格習(xí)慣,而這些習(xí)慣無(wú)非就是tab還是空格,換不換行,加不加空格等等之類(lèi)的瑣事,與其通過(guò)制定規(guī)范去強(qiáng)行限制開(kāi)發(fā)者的編寫(xiě)習(xí)慣,不如從工具層面徹底解決代碼風(fēng)格的問(wèn)題。eslint可以自動(dòng)處理一些代碼風(fēng)格的問(wèn)題,直接將代碼通過(guò)指定的規(guī)則格式化,使代碼整體風(fēng)格統(tǒng)一。

  更進(jìn)一步,eslint 還可以禁止代碼的一些可能造成不良影響的行為(例如eval,未定義變量),使其拋出錯(cuò)誤。降低代碼產(chǎn)生bug的可能性。

單元測(cè)試
  集成單元測(cè)試,提高代碼可靠性。前端較為流行的單元測(cè)試 mocha,qunit 等

UI 自動(dòng)化測(cè)試
  UI 自動(dòng)化測(cè)試是 軟件通過(guò)模擬瀏覽器,對(duì)頁(yè)面進(jìn)行UI操作,判斷是否產(chǎn)生預(yù)想的UI效果。目前較為流行的UI自動(dòng)化測(cè)試套件主要是 基于phantomjs的 nightmare

web組件化
  web組件化是通過(guò)自定義標(biāo)簽,從UI層面對(duì)代碼的拆分,提高前端代碼的可復(fù)用性。盡管w3c已經(jīng)初步對(duì)web組件化制定了規(guī)范, 但目前瀏覽器對(duì)web 組件化的支持慘不忍睹,無(wú)法通過(guò)原生的方法來(lái)實(shí)現(xiàn)web組件,但目前流行的前端框架,如vue,angular,react都有提供自己的web組件化,從而提高代碼可復(fù)用性。

前端工程化的發(fā)展

??如果引入js文件順序錯(cuò)了則會(huì)報(bào)錯(cuò)。 乍一看似乎沒(méi)什么難度呀,是人都能分清是吧。那么請(qǐng)看下面這種情況:
??有 a.js, b.js, c.js, d.js, e.js 五個(gè)文件,其中

a 依賴(lài) b和e,

b 依賴(lài) d和e,

c 依賴(lài) a和d,

d 依賴(lài) e,

e 無(wú)依賴(lài)。

??那么根據(jù)以上關(guān)系,請(qǐng)按正確順序引入js文件(黑人問(wèn)號(hào)???)。當(dāng)然,事實(shí)上也并不難區(qū)分其優(yōu)先級(jí),逐級(jí)遞推就很快可以推斷出引入順序?yàn)?e,d,b,a,c。

  毫無(wú)疑問(wèn),對(duì)于稍微復(fù)雜點(diǎn)的web工程,存在復(fù)雜依賴(lài)情況是極有可能發(fā)生的,并且把時(shí)間耗費(fèi)在管理依賴(lài)關(guān)系上也不值當(dāng)。

  所以就誕生了前端模塊化

模塊化標(biāo)準(zhǔn)(AMD,CMD,ES6 Module)

??經(jīng)歷了混亂加載的黑歷史,我們終于迎來(lái)了js的模塊化,忽如一夜春風(fēng)來(lái),一夜之間冒出一堆模塊化標(biāo)準(zhǔn)。

??其中具有代表性的模塊加載器分別是是遵循AMD(Asynchronous Module Definition)規(guī)范的RequireJS ,還有淘寶玉伯開(kāi)源的 遵循CMD(Common Module Definition)規(guī)范的 SeaJS。 兩者除了遵循規(guī)范不一樣之外,封裝模塊有差別之外,都各有所長(zhǎng),而且對(duì)舊版本瀏覽器的支持都相當(dāng)完美。

  當(dāng)然除了這兩個(gè),還有各類(lèi)其他開(kāi)發(fā)者開(kāi)發(fā)的模塊加載器,當(dāng)真是一番群魔亂舞百家爭(zhēng)鳴的盛世呀。在此就不一一細(xì)述了。

  下面有請(qǐng)我們的主角出廠: ES6 Module。

  ES6 Module 是新一代javascript標(biāo)準(zhǔn) ECMAScript 6 的新增特性,其語(yǔ)法和Python相似,比較簡(jiǎn)潔易用。另外,相比于其他模塊加載器,ES6 Module 是語(yǔ)法級(jí)別的實(shí)現(xiàn),其靜態(tài)代碼分析相比于其他框架會(huì)更快更高效,方便做代碼檢測(cè)。

// import 基本語(yǔ)法
import React from "react";    //等價(jià)于 var React = require("react");
import { stat, exists, readFile } from "fs";
// 等價(jià)于 
// var fs = require("fs");
// var stat = fs.stat, exists = fs.exists, readFile = fs.readFile;

  
??而且,且不論其API優(yōu)劣,其語(yǔ)法與前面說(shuō)的模塊化有什么區(qū)別的,ES6 Module最大優(yōu)點(diǎn)是顯而易見(jiàn)的: 它是官方標(biāo)準(zhǔn),而不是其他妖艷賤貨第三方開(kāi)發(fā)的框架/庫(kù)。跟著有名分的原配混,毫無(wú)疑問(wèn)是有前途更穩(wěn)定的吧。

  當(dāng)然,缺點(diǎn)也是很明顯的,不同于RequireJS,SeaJS 向下兼容到極致(ie6+),ES6 Module 的兼容性還未覆蓋絕大部分瀏覽器,支持ES6 Module的瀏覽器寥寥無(wú)幾,雖然可以通過(guò)babel進(jìn)行語(yǔ)法轉(zhuǎn)譯,不過(guò)兼容性畢竟是硬傷,唯有時(shí)間能治愈。

自動(dòng)化構(gòu)建工具(gulp,grunt)

??從描述可知,前端工程化需要做的事情,單憑人力一個(gè)一個(gè)去處理基本沒(méi)有可能完成,那么,我們就需要學(xué)會(huì)使用工具,畢竟程序猿和猿之間最大的區(qū)別就是會(huì)不會(huì)使用工具。

  grunt 和 gulp 就是自動(dòng)化構(gòu)建工具。我們通過(guò)安裝對(duì)應(yīng)的node_module,根據(jù)gulp/grunt 的API編寫(xiě)相對(duì)應(yīng)的任務(wù)(如:css預(yù)處理,代碼合并壓縮,代碼校驗(yàn)檢查等任務(wù),js代碼轉(zhuǎn)譯),那么就可以生成我們想要的結(jié)果,完成前端工作流管理,極大程度地提高效率。其作用其實(shí)就相當(dāng)于makefile 的make 操作,將手工操作自動(dòng)化,其任務(wù)編寫(xiě)格式如下。

// gulp scss預(yù)處理任務(wù)
gulp.task("styles", function() {
  return gulp.src("src/styles/main.scss")
    .pipe(sass({ style: "expanded" }))
    .pipe(autoprefixer("last 2 version", "safari 5", "ie 8", "ie 9", "opera 12.1", "ios 6", "android 4"))
    .pipe(gulp.dest("dist/assets/css"))
    .pipe(rename({suffix: ".min"}))
    .pipe(minifycss())
    .pipe(gulp.dest("dist/assets/css"))
    .pipe(notify({ message: "Styles task complete" }));
});
模塊化打包器(webpack)

??前面說(shuō)了那么多SeaJS,RequireJS的模塊化 ,又有g(shù)ulp ,grunt的自動(dòng)化處理,想必都有點(diǎn)覺(jué)得這前端工程化的技術(shù)棧也太繁瑣了吧。

  那么現(xiàn)在,你可以統(tǒng)統(tǒng)不用管啦,讓我們推出終極解決方案:Webpack?! ?br>
  相比于seajs / requirejs 需要在瀏覽器引入 sea.js 、require.js 的模塊解析器文件,瀏覽器才能識(shí)別其定義的模塊。 webpack不需要在瀏覽器中加載解釋器,而是直接在本地將模塊化文件(無(wú)論是AMD,CMD規(guī)范還是ES6 Module)編譯成瀏覽器可識(shí)別的js文件。

  另外,相對(duì)于gulp/grunt 的批處理工作流功能,webpack 也可以通過(guò) loader、plugin的形式對(duì)所有文件進(jìn)行處理,來(lái)實(shí)現(xiàn)類(lèi)似的功能。

  其主要工作方式是: 整個(gè)項(xiàng)目存在一個(gè)或多個(gè)入口js文件,通過(guò)這個(gè)入口找到項(xiàng)目的所有依賴(lài)文件,通過(guò)loader,plugin進(jìn)行處理后,打包生成對(duì)應(yīng)的文件,輸出到指定的output目錄中??梢哉f(shuō)是集模塊化與工作流于一身的工具




  當(dāng)然,webpack也并非銀彈。工具沒(méi)有好壞,只有適合與否。即便是webpack也并非適用于所有場(chǎng)合。

  webpack 的最大特點(diǎn)是一切皆為模塊,一切全包,最適和應(yīng)用在SPA一站式應(yīng)用場(chǎng)景。只有簡(jiǎn)單幾個(gè)頁(yè)面的情況下使用 webpack 反而可能會(huì)增加不必要的配置成本,反而直接用gulp或者其他工具處理代碼壓縮,css 預(yù)處理之類(lèi)的工作會(huì)更加快捷易用。

  另外,除了最主流的 webpack 之外,同性質(zhì)的模塊化打包器還有 browserIfy,以及百度的 fis ,由于對(duì)這兩者了解不多,就不一一比較了。

使用 webpack 實(shí)現(xiàn)工程化

??廢話少說(shuō),talk is easy , show me the code,我們來(lái)看看webpack是怎么工作的。以下是一個(gè)配置了webpack-dev-server的本地開(kāi)發(fā)webpack配置文件。 具體可訪問(wèn) github 地址 查看完整信息

// webpack.dev.config.js
let path = require("path"),
      webpack = require("webpack");

let resolve = path.resolve;
let webRootDir = resolve(__dirname, "../");


module.exports = {
    entry: {                 // 入口文件,打包通過(guò)入口,找到所有依賴(lài)的模塊,打包輸出
        main: resolve(webRootDir, "./src/main.js"), 
    },
    output: {
        path: resolve(webRootDir, "./build"),  // 輸出路徑
        publicPath: "/build/",     // 公共資源路徑
        filename: "[name].js"      // 輸出文件名字,此處輸出main.js, babel-polyfill.js ,  視情況可以配置[name].[chunkhash].js添加文件hash, 管理緩存
    },
    module: {
        rules: [   //模塊化的loader,有對(duì)應(yīng)的loader,該文件才能作為模塊被webpack識(shí)別
            {
                test: /.js$/,
                loader: "babel-loader",
                exclude: /node_modules/
            },
            {
                test: /.(png|jpg|gif|svg|ico)$/,
                loader: "file-loader",
                options: {
                    name: "[name].[ext]?[hash]"
                }
            },
            {
                test: /.(eot|svg|ttf|woff|woff2)(?S*)?$/,
                loader: "file-loader"
            },
            {
                test: /.css$/,
                loader: "style-loader!css-loader"
            },
            {
                test: /.scss$/,
                loader: "style-loader!css-loader!autoprefixer-loader?{browsers:["last 5 version", "Firefox" +
                " 15"]}!sass-loader?sourceMap&outputStyle=compressed"
            }
        ]
    },

    resolve: {
        extensions: [".js"],  // 定義后綴名 ,import時(shí)可以省略“.js”后綴
        alias: {   // 別名。 如 import "./src/style/common.css"  ==> import "style/common.css"
            "components": resolve(webRootDir, "./src/components"),
            "page": resolve(webRootDir, "./src/page"),
            "style": resolve(webRootDir, "./src/style"),
            "script": resolve(webRootDir, "./src/script"),
            "static": resolve(webRootDir, "./static")
        }
    },

    devServer: { // webpack-dev-server 熱加載的配置
        host: "127.0.0.1",   //本地ip, 如需局域網(wǎng)內(nèi)其他及其通過(guò)ip訪問(wèn),配置"0.0.0.0"即可
        port: 8080,
        disableHostCheck: true,
        historyApiFallback: true,
        noInfo: true
    },

    performance: {
        hints: false
    },

}

module.exports.devtool = "#source-map"

/*插件*/
module.exports.plugins = (module.exports.plugins || []).concat([
    // webpack 變量定義,,可在其他模塊訪問(wèn)到該變量值,以便根據(jù)不同環(huán)境來(lái)進(jìn)行不同情況的打包操作。
    //  例如,在main.js 下 console.log( process.env.Node_ENV ) 輸出 development字符串
    new webpack.DefinePlugin({
        "process.env": {     
            NODE_ENV: `"development"`
        }
    }),

])

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/88485.html

相關(guān)文章

  • 前端構(gòu)建工具整理

    摘要:常見(jiàn)前端構(gòu)建工具的分類(lèi)和對(duì)比是附帶的包管理器,是內(nèi)置的一個(gè)功能,允許在文件里面使用字段定義任務(wù)在這里,一個(gè)屬性對(duì)應(yīng)一段腳本,原理是通過(guò)調(diào)用去運(yùn)行腳本命令。 前文 端技術(shù)范圍不斷發(fā)展,前端開(kāi)發(fā)不僅限于直接編寫(xiě)html,css和javascript,Web應(yīng)用日益龐大,代碼也更加龐大,因此許多新的思想(例如模塊化和工程化等)和框架(React和Vue等),以及新的語(yǔ)言(Es6 TypeSc...

    leo108 評(píng)論0 收藏0
  • 前端程化工具初選

    摘要:面對(duì)日益紛雜的前端工具,作為新人常感無(wú)從下手。腳手架應(yīng)用開(kāi)發(fā)流程與工具項(xiàng)目生成器集成方案解決前端開(kāi)發(fā)中自動(dòng)化工具性能優(yōu)化模塊化框架開(kāi)發(fā)規(guī)范代碼部署開(kāi)發(fā)流程等問(wèn)題框架簡(jiǎn)潔直觀強(qiáng)悍的框架,讓開(kāi)發(fā)更迅速后端程序的福音。   面對(duì)日益紛雜的前端工具,作為新人常感無(wú)從下手。經(jīng)過(guò)一番檢索和簡(jiǎn)單對(duì)比,再結(jié)合自己的喜好,篩選了將要學(xué)習(xí)和使用的工具,以適應(yīng)日益工程化、專(zhuān)業(yè)化的 Web 前端開(kāi)發(fā)工作。 s...

    Rocture 評(píng)論0 收藏0
  • 基于TmodJS的前端模板程化解決方案

    摘要:原作者唐斌騰訊什么原名是一個(gè)簡(jiǎn)單易用的前端模板預(yù)編譯工具。本文作者為來(lái)自騰訊團(tuán)隊(duì)的唐斌,他在本文中為我們分析了傳統(tǒng)前端模板內(nèi)嵌的弊端,如開(kāi)發(fā)調(diào)試效率低下自動(dòng)化構(gòu)建復(fù)雜度比較高等特點(diǎn),并針對(duì)目前現(xiàn)狀給出了較好的解決方案。 原作者: 唐斌(騰訊)| TmodJS什么 TmodJS(原名atc)是一個(gè)簡(jiǎn)單易用的前端模板預(yù)編譯工具。它通過(guò)預(yù)編譯技術(shù)讓前端模板突破瀏覽器限制,實(shí)現(xiàn)后端模板一樣的同...

    zhaochunqi 評(píng)論0 收藏0
  • 如何構(gòu)建前端代碼

    摘要:首先散文件是有害處的,第一是,散文件可能沒(méi)有版本號(hào)的區(qū)分,這樣因?yàn)榫彺鎸?dǎo)致第二是散文件會(huì)嚴(yán)重拖慢性能,因?yàn)楹芏嗌⑽募粌H消耗請(qǐng)求資源,而且是在串行消耗。 基本認(rèn)識(shí) 開(kāi)發(fā)環(huán)境和線上環(huán)境的區(qū)別 在很久以前,前端的部署其實(shí)比較簡(jiǎn)單,開(kāi)發(fā)環(huán)境下,靜態(tài)資源往服務(wù)器上面一扔就ok了,如果考慮下優(yōu)化或者代碼保護(hù),也只是加一個(gè)代碼壓縮和混淆。沒(méi)錯(cuò),剛?cè)胄械臅r(shí)候我就是這么干的。。。 但是隨著前...

    jhhfft 評(píng)論0 收藏0
  • 前端構(gòu)建 = 程化 + 動(dòng)化

    摘要:基于平臺(tái)的開(kāi)發(fā)框架路由中間件使用中間件將整合工具對(duì)外提供的命令配置將不斷更新完善 express: 基于nodejs平臺(tái)的web開(kāi)發(fā)框架express = 路由 + 中間件 showImg(https://segmentfault.com/img/bVbalNI?w=1600&h=1200); 使用express中間件 將task整合showImg(https://segmentfau...

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

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

0條評(píng)論

閱讀需要支付1元查看
<