前端自動化構建工具

来源:https://www.cnblogs.com/lihuijuan/archive/2018/07/13/9296315.html
-Advertisement-
Play Games

全局安裝是把包安裝在Node安裝目錄下的node_modules文件夾中,一般在 \Users\用戶名\AppData\Roaming\ 目錄下,可以使用npm root -g查看全局安裝目錄 本地(局部)安裝是把包安裝在指定項目(要在指定的根目錄下輸入命令)的node_modules文件夾下(若沒 ...


全局安裝是把包安裝在Node安裝目錄下的node_modules文件夾中,一般在 \Users\用戶名\AppData\Roaming\ 目錄下,可以使用npm root -g查看全局安裝目錄

本地(局部)安裝是把包安裝在指定項目(要在指定的根目錄下輸入命令)的node_modules文件夾下(若沒有,會自動創建一個node_modules文件夾)

具體區別,推薦博文:  全局安裝和本地(局部)安裝的區別

 本地安裝可以讓每個項目擁有獨立的包,不受全局包的影響,方便項目的移動、複製、打包等,保證不同版本包之間的相互依賴

一、理解

1、什麼是項目構建?

  • 編譯項目中的 js、sass、less
  • 合併js/css等文件(使用構建工具合併後,會自動生成合併後文件,這樣只需引入合併文件即可,減少資源載入的次數)
  • 壓縮js/css/html等資源文件(減小文件的大小,減小記憶體占用)
  • js語法的檢查

項目構建可以減少項目的重量,

2、構建工具的作用?

簡化項目構建,自動化完成構建

二、構建工具

主要有三種:Grunt、Gulp、Webpack

1、Grunt(中文網

(1)介紹:

是一套前端自動化構建工具,一個基於nodeJs的命令行工具,它是一個任務運行器, 配合其豐富強大的插件

執行任務時是同步的,要註意任務的順序

(2)常用功能:

  • 合併文件(js/css)
  • 壓縮文件(js/css)
  • 語法檢查(js)
  • less/sass預編譯處理
  • 其它

(3)安裝步驟

  • 安裝grunt

全局安裝 grunt-cli:npm install -g grunt-cli

局部安裝grunt:npm install grunt --save-dev 

  • 配置文件: Gruntfile.js:

此配置文件本質就是一個node函數類型模塊
配置編碼包含3步:

1. 初始化插件配置 2. 載入插件任務

3. 註冊構建任務基本編碼:

  • 構建命令
  • 使用插件
module.exports = function(grunt){
// 1. 初始化插件配置
grunt.initConfig({
//主要編碼處
});
// 2. 載入插件任務
// grunt.loadNpmTasks('grunt-contrib-concat');
// 3. 註冊構建任務
grunt.registerTask('default', []);
};

(4)Grunt常用插件:

  1. grunt-contrib-clean——清除文件(打包處理生成的)
  2. grunt-contrib-concat——合併多個文件的代碼到一個文件中
  3. grunt-contrib-uglify——壓縮js文件
  4. grunt-contrib-jshint——javascript語法錯誤檢查;
  5. grunt-contrib-cssmin——壓縮/合併css文件
  6. grunt-contrib-htmlmin——壓縮html文件
  7. grunt-contrib-imagemin——壓縮圖片文件(無損)
  8. grunt-contrib-copy——複製文件、文件夾
  9. grunt-contrib-requirejs——合併壓縮requirejs管理的所有js模塊文件
  10. grunt-contrib-watch——實時監控文件變化、調用相應的任務重新執行

2、Gulp(中文網

gulp是與grunt功能類似的前端項目構建工具, 也是基於Nodejs的自動任務運行器
能自動化地完成 javascript/coffee/sass/less/html/image/css 等文件的合併、壓縮、檢查、監聽文件變化、瀏覽器自動刷新、測試等任務
gulp更高效(非同步多任務), 更易於使用, 插件高質量

(1)特點:

  • 任務化
  • 基於流(gulp有一個自己的記憶體,通過指定API將源文件流到記憶體中,完成相應的操作後再通過相應的API流出去)
  • 執行任務可以同步可以非同步

gulpfile.js-----gulp配置文件 任務執行時,會首先執行該文件

(2)重要API:

  1. gulp.src(filePath/pathArr) : 指向指定路徑的所有文件,找到目標源文件,將數據讀取到gulp的記憶體中
  2. gulp.dest(dirPath/pathArr):指向指定的所有文件夾,將文件輸出到指定的文件夾中
  3. gulp.task(name, [deps], fn) :定義一個任務
  4. gulp.watch() :監視文件的變化

 

(3)安裝步驟 (全局安裝gulp是為了執行gulp任務,本地安裝gulp則是為了調用gulp插件的功能

  • 安裝gulp:
  1. 全局安裝gulp:npm install gulp -g
  2. 局部安裝gulp:npm install gulp --save-dev
  • 配置編碼: gulpfile.js

    //引入gulp模塊
    var gulp = require('gulp');
    //註冊任務
    gulp.task('任務名', function() {
      
// 任務的操作
    });

    //註冊預設任務
    gulp.task('default', ['任務名'])

  • 構建命令:
    在終端  根目錄下  輸入:
    gulp   
    會執行gulpfile.js文件中所有的任務

   gulp 任務名   會執行gulpfile.js文件中指定的任務  

  • 使用gulp插件

(4)相關插件 

  • gulp-concat : 合併文件(js/css)
  • gulp-uglify : 壓縮js文件
  • gulp-rename : 文件重命名
  • gulp-less : 編譯less 轉化less語法為css
  • gulp-clean-css : 壓縮css文件
  • gulp-livereload : 實時自動編譯刷新

下載插件(可一次下載安裝多個,安裝在項目根目錄下):

npm install gulp-concat gulp-uglify gulp-rename --save-dev

npm install gulp-less gulp-clean-css --save-dev 

(5)舉例:下麵是一個gulpfile.js文件

var gulp = require('gulp');//引入的gulp是一個對象
//引入的插件  均為方法
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var less = require('gulp-less');
var cssClean = require('gulp-clean-css');

//註冊任務(基本語法)
// gulp.task('任務名',function(){
//     //任務的操作
//
// })

//註冊 合併壓縮js的任務
gulp.task('js',function(){
    return gulp.src('src/js/*.js') //找到目標源文件,將數據讀取到gulp的記憶體中  *代表全部文件
        .pipe(concat('build.js')) //參數為 合併後 js文件的名字
        .pipe(gulp.dest('dist/js/')) //參數為 輸出文件到的文件夾  只要還沒有操作完說明當前的文件還在記憶體中
        .pipe(uglify()) //壓縮文件
        .pipe(rename({suffix:".min"}))//重命名
        .pipe(gulp.dest('dist/js/'));
});
//註冊 轉換less為css的任務
gulp.task('less',function(){
    //帶上return 為非同步 ;不帶return 為同步;非同步速度快,因為任務可以同時載入,建議用非同步
    return gulp.src('src/less/*.less')
        .pipe(less()) //編譯less文件為css文件
        .pipe(gulp.dest('src/css/'))
});

//註冊 合併壓縮css文件的任務
gulp.task('css',['less'],function(){ //['less'] 表示 css任務的執行依賴於less任務,只有當less任務全部執行後,才會開啟css任務
    return gulp.src('src/css/*.css') //找到文件
        .pipe(concat('build.css')) //合併文件
        .pipe(cssClean()) //壓縮文件
        .pipe(rename({suffix: '.min'})) //重命名
        .pipe(gulp.dest('dist/css/')); //輸出文件
});
//註冊 預設任務
gulp.task('default',['js','less','css']);

終端處 在項目根目錄下 輸入:

  • gulp js  會自動執行該 js 任務
  • gulp css 會自動執行 該 css 任務
  • gulp less 會自動執行該less 任務
  • gulp 會自動執行所有任務

 目錄結構大致如下:

 

最後還有一個自動編譯插件(即源碼發生改變時,原先經過處理的文件會自動更新,不用再重新gulp構建一遍)

 自動編譯

下載插件:
npm install gulp-livereload --save-dev

配置編碼::
var livereload = require('gulp-livereload');

//所有的任務後邊 都要加上一個“管道”,來保持更新:
.pipe(livereload());

//註冊 監測任務
gulp.task('watch', ['default'], function () { 
//開啟監視:
livereload.listen();
//監視指定的文件, 並指定對應的處理任務

gulp.watch('src/js/*.js',['js']);
gulp.watch(['src/css/*.css','src/less/*.less'],['css'])

});

這樣,當文件發生改變時,不用再重新gulp,編譯的文件會自動發生改變

3、Webpack(中文網

(1)說明:

Webpack是前端資源模塊化管理和打包工具,一個模塊打包器(bundler)。
在Webpack看來, 前端的所有資源文件(js/json/css/img/less/...)都會作為模塊處理
它將根據模塊的依賴關係進行靜態分析,生成對應的靜態資源

Webpack的工作方式是:把你的項目當做一個整體,通過一個給定的主文件(如:index.js),Webpack將從這個文件開始找到你的項目的所有依賴文件,使用loaders處理它們,最後打包為一個(或多個)瀏覽器可識別的JavaScript文件。

與gulp和grunt相比,Webpack的處理速度更快更直接,能打包更多不同類型的文件,更主要的區別還是 webpack是一個模塊化打包工具。

(2)四個核心概念:

  • 入口(entry):指示 webpack 應該使用哪個模塊,來作為構建其內部依賴圖的開始。進入入口起點後,webpack 會找出有哪些模塊和庫是入口起點(直接和間接)依賴的。
  • 輸出(output):告訴 webpack 在哪裡輸出它所創建的 bundles,以及如何命名這些文件,預設值為 ./dist。基本上,整個應用程式結構,都會被編譯到你指定的輸出路徑的文件夾中。
  • loader:讓 webpack 能夠去處理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 可以將所有類型的文件轉換為 webpack 能夠處理的有效模塊,然後你就可以利用 webpack 的打包能力,對它們進行處理
  • 插件(plugins):使用時,require() 引入,然後把它添加到 plugins 數組中

(3)安裝

全局安裝:

npm install webpack webpack-cli --g

局部安裝(本地安裝):

npm install webpack webpack-cli --save-dev

(4)舉例:下麵是一個 webpack.config.js文件

const path = require('path');//path是內置的模塊,用來設置路徑
const HtmlWebpackPlugin = require('html-webpack-plugin'); //自動生成html文件的插件
const CleanWebpackPlugin = require('clean-webpack-plugin'); //清除之前打包的文件

module.exports = {
    entry: './src/js/entry.js', // 入口文件
    output: { // 輸出配置
        filename: 'bundle.js', // 輸出文件名
        path: path.resolve(__dirname, 'dist/js')  //輸出文件路徑配置  __dirname代表根目錄
    },
    module: {
        rules: [ //樣式 loader
            {
                test: /\.css$/,
                use: [
                    'style-loader',
                    'css-loader'
                ]
            },
            { //圖片 loader
                test: /\.(png|jpg|gif)$/,
                use: [
                    {
                        loader: 'url-loader',
                        options: {
                            limit: 8192
                        }
                    }
                ]
            }
        ]
    },
    devServer: {//熱部署
        contentBase: 'dist/js/' //若為空 webpack-dev-server預設服務於根目錄下的index.html
    },
    plugins: [ //插件列表
        new HtmlWebpackPlugin({template: './index.html'}),
        new CleanWebpackPlugin(['dist']),
    ]
};

示例代碼及教程


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Mac 關於本機-磁碟管理,如果發現系統占用超過80g以上的小伙伴們可以做以下操作只需要以下4個步驟,輕鬆降到30g以內!!!!!!!(僅適用於安裝了Xcode的小伙伴) 打開Finder,command + shift +g (前往文件夾),刪除一下路徑的文件即可~ 1、 iOS DeviceSu ...
  • 引言 學習《android第一行代碼》根據書本開發的天氣預報app,主要用於熟練操作android開發(android studio3.0平臺)。 今天主要分享一下從伺服器上獲取天氣信息,通過ListView綁定數據的操作(可以採用RecycleView),然後進行頁面點擊跳轉。 一、 伺服器返回數 ...
  • 這篇文章的重點不在於說是對終端語法的講解,而是方便大家做語法備忘. 方便查找對應終端語法.所以使用了表格形式對常用終端語法進行了彙總, 但是並沒有很多的講解部分. 當然了這裡記錄的也都是十分基礎的語法部分, 我相信大家都是可以看得懂的,畢竟大家都是十分優秀的程式猿哦~ 路徑相關 指令表示含義 pwd ...
  • Android自帶的語音播報+訊飛語音播報封裝(直接用)。 涉及功能: 1.多個許可權申請 2.自帶語音實現 3.訊飛語音播報封裝... ...
  • index代碼: 參考資料:《菜鳥教程》 ...
  • 效果如下: ...
  • 今天在學習angularjs的分頁插件時遇到了一個前端的問題,谷歌瀏覽器開發者模式調試的時候發現每次點擊分頁刷新按鈕會觸發兩次後臺請求,ajax向後臺發送了兩次請求,這對於強迫症患者來說是一個比較噁心和感到不舒服的事情。 於是在網上也找到了靠譜的解決方案:http://jqvue.com/tm.pa ...
  • 在IT界已經混了5年了,5年中瀏覽了不少的網站,在上面查詢自己想要的東西,解決工作中遇到的問題,心裡總想有天自己能夠有自己的博客,能給分享一些自己在生活中、工作中遇到的問題,讓其他有類似經歷的朋友能夠少走彎路,今天終於鼓起勇氣在博客園寫下第一篇隨筆。其他不做過多的介紹,下麵將介紹今天在工作中遇到的一 ...
一周排行
    -Advertisement-
    Play Games
  • 基於.NET Framework 4.8 開發的深度學習模型部署測試平臺,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等應用場景,同時支持圖像與視頻檢測。模型部署引擎使用的是OpenVINO™、TensorRT、ONNX runti... ...
  • 十年沉澱,重啟開發之路 十年前,我沉浸在開發的海洋中,每日與代碼為伍,與演算法共舞。那時的我,滿懷激情,對技術的追求近乎狂熱。然而,隨著歲月的流逝,生活的忙碌逐漸占據了我的大部分時間,讓我無暇顧及技術的沉澱與積累。 十年間,我經歷了職業生涯的起伏和變遷。從初出茅廬的菜鳥到逐漸嶄露頭角的開發者,我見證了 ...
  • C# 是一種簡單、現代、面向對象和類型安全的編程語言。.NET 是由 Microsoft 創建的開發平臺,平臺包含了語言規範、工具、運行,支持開發各種應用,如Web、移動、桌面等。.NET框架有多個實現,如.NET Framework、.NET Core(及後續的.NET 5+版本),以及社區版本M... ...
  • 前言 本文介紹瞭如何使用三菱提供的MX Component插件實現對三菱PLC軟元件數據的讀寫,記錄了使用電腦模擬,模擬PLC,直至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1. PLC開發編程環境GX Works2,GX Works2下載鏈接 https:// ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • 1、jQuery介紹 jQuery是什麼 jQuery是一個快速、簡潔的JavaScript框架,是繼Prototype之後又一個優秀的JavaScript代碼庫(或JavaScript框架)。jQuery設計的宗旨是“write Less,Do More”,即倡導寫更少的代碼,做更多的事情。它封裝 ...
  • 前言 之前的文章把js引擎(aardio封裝庫) 微軟開源的js引擎(ChakraCore))寫好了,這篇文章整點js代碼來測一下bug。測試網站:https://fanyi.youdao.com/index.html#/ 逆向思路 逆向思路可以看有道翻譯js逆向(MD5加密,AES加密)附完整源碼 ...
  • 引言 現代的操作系統(Windows,Linux,Mac OS)等都可以同時打開多個軟體(任務),這些軟體在我們的感知上是同時運行的,例如我們可以一邊瀏覽網頁,一邊聽音樂。而CPU執行代碼同一時間只能執行一條,但即使我們的電腦是單核CPU也可以同時運行多個任務,如下圖所示,這是因為我們的 CPU 的 ...
  • 掌握使用Python進行文本英文統計的基本方法,並瞭解如何進一步優化和擴展這些方法,以應對更複雜的文本分析任務。 ...
  • 背景 Redis多數據源常見的場景: 分區數據處理:當數據量增長時,單個Redis實例可能無法處理所有的數據。通過使用多個Redis數據源,可以將數據分區存儲在不同的實例中,使得數據處理更加高效。 多租戶應用程式:對於多租戶應用程式,每個租戶可以擁有自己的Redis數據源,以確保數據隔離和安全性。 ...