最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解webpack4.x之搭建前端開發(fā)環(huán)境

 更新時間:2019年03月28日 09:00:19   作者:Gerryli  
這篇文章主要介紹了詳解webpack4.x之搭建前端開發(fā)環(huán)境,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

webpack是一個現(xiàn)代JavaScript應(yīng)用程序的靜態(tài)模塊打包器,借用官網(wǎng)的一張圖,它能夠?qū)⒁恍╊A(yù)處理語言,js的最新語法轉(zhuǎn)換成瀏覽器識別的內(nèi)容?,F(xiàn)在一般的前端框架都有比較成熟的腳手架,大多數(shù)對webpack都有個較好的集成,我們只需要敲一些簡單的命令就能生成一個通用的項目模板,比較便捷,但是要知其然知其所以然,所以今天就嘗試著從零開始搭建一個前端開發(fā)環(huán)境。

項目源碼:

https://github.com/gerryli0214/webpack-demo

webpack的四個核心概念:

1.、入口(entry)

2、輸出(output)

3、loader

4、插件(plugins)

首先,我們執(zhí)行下npm init;初始化一個node工程,填寫項目的信息,整個項目的目錄結(jié)構(gòu)如下:

全部安裝webpack-cli:

npm install webpack-cli -g

新建一個 webpack.config.js, 這個是webpack默認(rèn)配置文件,在里面我們可以配置打包信息,初始化文件為:

const config = {};
module.exports = config;

入口(entry):

項目的入口文件,可以配置單個/多個,為入口文件的相對路徑,type: string/object; 我們項目入口文件為index.js。

const config = {
  entry: './src/index.js'
}

module.exports = config;

輸出(output):

打包后的文件路徑和配置信息,path為打包文件路徑,filename為輸出文件名稱,name為原始文件名稱,hash為打包后的hash地址:

output: {
  path: path.resolve(__dirname, 'dist'),
  filename: '[name].[hash].min.js'
}

loader:

loader能夠處理非JavaScript文件,webpack默認(rèn)只能處理JavaScript文件。在使用loader時,首先要安裝下指定loader的依賴,此部分的配置規(guī)則與之前版本有所差異,具體配置如下:

npm install babel-loader css-loader -D
module: {
    rules: [{
        test: /\.css$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: 'css-loader'
        })
      },
      {
        test: /\.js/,
        exclude: /node_modules/, //過濾node_modules文件夾
        use: [{
          loader: 'babel-loader'
        }]
      }
    ]
  }

插件(plugins):

插件是webpack最為強(qiáng)大的功能之一,利用插件,我們可以進(jìn)行代碼的混淆、壓縮、重新定義項目環(huán)境變量等。插件分為webpack內(nèi)置插件和第三方插件,第三方插件在使用時首先要安裝依賴和導(dǎo)入依賴模塊。詳細(xì)的使用方法可以參考npm。下面羅列了幾個項目中常用的插件:

html-webpack-plugin:

主要作用:

1、為html文件中引入的外部資源如 script 、 link 動態(tài)添加每次compile后的hash,防止引用緩存的外部文件問題

2、可以生成創(chuàng)建html入口文件,比如單頁面可以生成一個html文件入口,配置多個就可以打包成多頁面

extract-text-webpack-plugin:

主要作用:分離打包的css文件

uglifyjs-webpack-plugin:

主要作用:混淆js代碼

webpack-bundle-analyzer:

主要作用:生成打包文件報告,可以看到各個模塊打包后文件大小信息

clean-webpack-plugin:

主要作用:每次打包之前清除dist文件夾

配置信息如下:

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const CleanWebpackPlugin = require('clean-webpack-plugin');

const config = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[hash].min.js'
  },
  module: {
    rules: [{
        test: /\.css$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: 'css-loader'
        })
      },
      {
        test: /\.js/,
        exclude: /node_modules/, //過濾node_modules文件夾
        use: [{
          loader: 'babel-loader'
        }]
      }
    ]
  },
  optimization: {
    splitChunks: {
      name: "vendor",
      filename: 'vendor-[hash].min.js'
    },
    minimizer: [new UglifyJsPlugin()]
  },
  plugins: [
    new HtmlWebpackPlugin({ template: './src/index.html' }),
    new ExtractTextPlugin({
      filename: 'build.min.css',
      allChunks: true,
    }),
    new webpack.BannerPlugin({
      banner: `構(gòu)建時間:${new Date().getFullYear()}-${new Date().getMonth()+1}-${new Date().getDate()}`
    }),
    new CleanWebpackPlugin(),
    // new webpack.EnvironmentPlugin({ NODE_ENV: 'production' }),
    new BundleAnalyzerPlugin()
  ]
};

module.exports = config;

以上為打包的基礎(chǔ)配置信息,在我們實際開發(fā)中,經(jīng)常會用到前端開發(fā)服務(wù),模塊熱更新以及前端的跨域請求代理,webpack中提供了webpack-dev-server來滿足我們的需求,在使用之前先安裝下webpack-dev-server的依賴:

npm install webpack-dev-server -D

具體文件配置如下:

devServer: {
    contentBase: path.join(__dirname, 'dist'),
    compress: true,
    host: '0.0.0.0',
    port: 9000,
    hot: true, //是否熱更新
    proxy: { //代理
      '/api': 'http://localhost:3000'
    }
  }

package.json中啟動命令配置如下:

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "webpack-dev-server --mode development",
    "build": "webpack --mode production"
  }

執(zhí)行npm run start,執(zhí)行結(jié)果如下:

這樣開發(fā)環(huán)境我們的主要配置就完成了,但是當(dāng)我們用uglifyjs壓縮es6代碼時,會發(fā)現(xiàn)會報錯,因為uglifyjs不能壓縮es6的代碼,此時我們需要手動配置下babel,具體步驟如下:

1、安裝項目依賴

npm install @babel/core @babel/preset-env -D

2、新建在項目根目錄下 .babelrc 文件,填入以下配置信息

{
  "presets":["@babel/preset-env"]
}

執(zhí)行npm run build,壓縮項目代碼,結(jié)果如下:

全部代碼:

const path = require('path');
const webpack = require('webpack');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const CleanWebpackPlugin = require('clean-webpack-plugin');

const config = {
  entry: './src/index.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].[hash].min.js'
  },
  module: {
    rules: [{
        test: /\.css$/,
        use: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          use: 'css-loader'
        })
      },
      {
        test: /\.js/,
        exclude: /node_modules/, //過濾node_modules文件夾
        use: [{
          loader: 'babel-loader'
        }]
      }
    ]
  },
  optimization: {
    splitChunks: {
      name: "vendor",
      filename: 'vendor-[hash].min.js'
    },
    minimizer: [new UglifyJsPlugin()]
  },
  plugins: [
    new HtmlWebpackPlugin({ template: './src/index.html' }),
    new ExtractTextPlugin({
      filename: 'build.min.css',
      allChunks: true,
    }),
    new webpack.BannerPlugin({
      banner: `構(gòu)建時間:${new Date().getFullYear()}-${new Date().getMonth()+1}-${new Date().getDate()}`
    }),
    new CleanWebpackPlugin(),
    // new webpack.EnvironmentPlugin({ NODE_ENV: 'production' }),
    new BundleAnalyzerPlugin()
  ],
  devServer: {
    contentBase: path.join(__dirname, 'dist'),
    compress: true,
    host: '0.0.0.0',
    port: 9000,
    hot: true, //是否熱更新
    proxy: { //代理
      '/api': 'http://localhost:3000'
    }
  },
  devtool: 'source-map'
};

module.exports = config;

參考資料:

webpack中文網(wǎng): https://www.webpackjs.com

webpack內(nèi)置插件列表: https://www.webpackjs.com/plugins/

第三方插件可自行搜索npm: https://www.npmjs.com/

項目源碼:https://github.com/gerryli0214/webpack-demo

文筆比較粗糙,如有問題,煩請指出,謝謝!以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • js表格分頁實現(xiàn)代碼

    js表格分頁實現(xiàn)代碼

    js表格分頁實現(xiàn)代碼,需要的朋友可以參考下。
    2009-09-09
  • js中同步與異步處理的方法和區(qū)別總結(jié)

    js中同步與異步處理的方法和區(qū)別總結(jié)

    若要在使用ajax請求后處理發(fā)送請求返回的結(jié)果,最好使用同步請求,下面為大家介紹下js中同步與異步處理的方法和區(qū)別,感興趣的朋友不要錯過
    2013-12-12
  • 使用webpack/gulp構(gòu)建TypeScript項目的方法示例

    使用webpack/gulp構(gòu)建TypeScript項目的方法示例

    這篇文章主要介紹了使用webpack/gulp構(gòu)建TypeScript項目的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • JavaScript使用Broadcast?Channel實現(xiàn)前端跨標(biāo)簽頁通信

    JavaScript使用Broadcast?Channel實現(xiàn)前端跨標(biāo)簽頁通信

    這篇文章主要為大家詳細(xì)介紹了JavaScript如何使用Broadcast?Channel實現(xiàn)前端跨標(biāo)簽頁通信,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • 微信小程序阻止頁面返回實例詳解(包滑動、自動返回鍵)

    微信小程序阻止頁面返回實例詳解(包滑動、自動返回鍵)

    小程序如果在頁面內(nèi)進(jìn)行復(fù)雜的界面設(shè)計,用戶進(jìn)行返回操作會直接離開當(dāng)前頁面,不符合用戶預(yù)期,下面這篇文章主要給大家介紹了關(guān)于微信小程序阻止頁面返回(包滑動、自動返回鍵)的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • JavaScript本地存儲實現(xiàn)用戶名存儲案例

    JavaScript本地存儲實現(xiàn)用戶名存儲案例

    本文主要介紹了JavaScript本地存儲實現(xiàn)用戶名存儲案例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • js的map、flatMap和find、filter的使用詳解

    js的map、flatMap和find、filter的使用詳解

    map和flatMap都是返回一個新數(shù)組,map不會改變數(shù)組長度,flatMap可以改變長度,find和filter都是過濾操作,find只會返回第一個找到的值,而filter會返回全部符合要求的對象
    2024-12-12
  • 微信小程序?qū)崿F(xiàn)音樂播放器實例完整流程

    微信小程序?qū)崿F(xiàn)音樂播放器實例完整流程

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)音樂播放器實例完整流程,通過本章的學(xué)習(xí),讀者能夠掌握小程序的基本交互邏輯的開發(fā),能夠運(yùn)用API來實現(xiàn)項目中的特定功能,學(xué)會解決開發(fā)過程中常見的問題,需要的朋友可以參考下
    2024-10-10
  • js 判斷字符串中是否包含某個字符串的實現(xiàn)代碼

    js 判斷字符串中是否包含某個字符串的實現(xiàn)代碼

    工作中經(jīng)常會使用到判斷一個字符串是否包含某一個字符串,因此總結(jié)一下幾個方法,需要的朋友可以參考下
    2023-03-03
  • JS中hasOwnProperty方法用法簡介

    JS中hasOwnProperty方法用法簡介

    hasOwnProperty(propertyName)方法 是用來檢測屬性是否為對象的自有屬性,如果是,返回true,否者false; 參數(shù)propertyName指要檢測的屬性名,這篇文章給大家介紹JS中hasOwnProperty方法用法簡介,感興趣的朋友一起看看吧
    2024-01-01

最新評論

界首市| 邳州市| 房产| 咸阳市| 大荔县| 横山县| 柘荣县| 潼南县| 和硕县| 汪清县| 鄂温| 和龙市| 台安县| 虞城县| 黄平县| 崇文区| 阿尔山市| 蕉岭县| 乡城县| 佛山市| 富顺县| 兰西县| 托克托县| 曲水县| 丰顺县| 盐山县| 崇信县| 惠东县| 华亭县| 太原市| 恩平市| 盐源县| 黔西| 新津县| 昂仁县| 新巴尔虎左旗| 平谷区| 南宫市| 四会市| 曲阜市| 墨竹工卡县|