国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Webpack4 搭建 Vue 項(xiàng)目

2shou / 2188人閱讀

摘要:前言由于打包工具的影響,也追求零配置搭建項(xiàng)目。本文就帶你繞過(guò),用一步步搭建項(xiàng)目。解決文件中引入的文件名因變動(dòng)而變動(dòng)的問(wèn)題項(xiàng)目源碼

1. 前言

由于 Parcel 打包工具的影響,webpack4 也追求零配置搭建項(xiàng)目。而前陣子出現(xiàn)的 vue-cli 3.0也是基于 webpack4 零配置的思想創(chuàng)建的。對(duì)于一些習(xí)慣webpack3 的開(kāi)發(fā)者難免有些不習(xí)慣。本文就帶你繞過(guò) vue-cli,用 webpack4 一步步搭建 vue 項(xiàng)目。

注:(本文講述的是webpack4基礎(chǔ)配置,文章有點(diǎn)長(zhǎng),請(qǐng)耐心看完。或者直接查看項(xiàng)目源碼,或者ctrl + w

2. 項(xiàng)目搭建

創(chuàng)建 createVue 文件夾,進(jìn)入該文件夾, npm init 初始化項(xiàng)目

安裝 webpack 四件套

npm i webpack webpack-cli webpack-dev-server webpack-merge --save-dev

// 當(dāng)前我使用版本
"webpack": "^4.16.3",
"webpack-cli": "^3.1.0",
"webpack-dev-server": "^3.1.5", // 開(kāi)發(fā)服務(wù)器
"webpack-merge": "^4.1.4" // webpack 配置合并

創(chuàng)建相應(yīng)文件

createVue
  |--dist
  |--build
      |--webpack.prod.js
      |--webpack.dev.js
      |--webpack.base.js
  |--src
      |--index.js
      |--app.vue
  |--index.html
// webpack.base.js
// 存放 dev 和 prod 通用配置
const webpack = require("webpack");

module.exports = {
  entry: "./src/index.js", //入口
  module: {
    rules: []
  },
  plugins: [
    // 解決vender后面的hash每次都改變
    new webpack.HashedModuleIdsPlugin(),
  ],// 插件
};
// webpack.dev.js
// 存放 dev 配置
const merge = require("webpack-merge");
const common = require("./webpack.base.js");
const path = require("path");

module.exports = merge(common, {
  devtool: "inline-source-map",
  devServer: { // 開(kāi)發(fā)服務(wù)器
    contentBase: "../dist"
  },
  output: { // 輸出
    filename: "js/[name].[hash].js", // 每次保存 hash 都變化
    path: path.resolve(__dirname, "../dist")
  },
  module: {},
  mode: "development",
});
// webpack.prod.js
// 存放 prod 配置
const path = require("path");
// 合并配置文件
const merge = require("webpack-merge");
const common = require("./webpack.base.js");

module.exports = merge(common, {
  module: {},
  plugins: [],
  mode: "production",
  output: {
    filename: "js/[name].[contenthash].js", //contenthash 若文件內(nèi)容無(wú)變化,則contenthash 名稱(chēng)不變
    path: path.resolve(__dirname, "../dist")
  },
});

webpack4 增加了 mode 屬性,設(shè)置為 development / production,以下是默認(rèn)配置

development:

process.env.NODE_ENV 的值設(shè)為 development
默認(rèn)開(kāi)啟以下插件,充分利用了持久化緩存。參考基于 webpack 的持久化緩存方案

NamedChunksPlugin :以名稱(chēng)固化 chunk id
NamedModulesPlugin :以名稱(chēng)固化 module id

production:

process.env.NODE_ENV 的值設(shè)為 production
默認(rèn)開(kāi)啟以下插件,其中 SideEffectsFlagPlugin 和 UglifyJsPlugin 用于 tree-shaking


FlagDependencyUsagePlugin :編譯時(shí)標(biāo)記依賴
FlagIncludedChunksPlugin :標(biāo)記子chunks,防子chunks多次加載
ModuleConcatenationPlugin :作用域提升(scope hosting),預(yù)編譯功能,提升或者預(yù)編譯所有模塊到一個(gè)閉包中,提升代碼在瀏覽器中的執(zhí)行速度
NoEmitOnErrorsPlugin :在輸出階段時(shí),遇到編譯錯(cuò)誤跳過(guò)
OccurrenceOrderPlugin :給經(jīng)常使用的ids更短的值
SideEffectsFlagPlugin :識(shí)別 package.json 或者 module.rules 的 sideEffects 標(biāo)志(純的 ES2015 模塊),安全地刪除未用到的 export 導(dǎo)出
UglifyJsPlugin :刪除未引用代碼,并壓縮
// index.js
// 需 npm i vue --save
import Vue from "vue";
import App from "./App.vue"
import "./index.scss"
new Vue({
  el: "#app",
  render: h => h(App),
});









  
    
    Suporka Vue App
  
  
    

安裝 vue 核心解析插件

npm i vue-loader vue-template-compiler --save-dev

// 當(dāng)前我使用版本
"vue-loader": "^15.2.6",
"vue-template-compiler": "^2.5.17",

由于 vue 的解析在 dev 和 prod 中均需使用,因此歸入基本配置 base

// webpack.base.js

// ...省略號(hào)
// vue-loader 插件
const VueLoaderPlugin = require("vue-loader/lib/plugin");
module.exports = {
  //...省略號(hào)
  module: {
    rules: [
      {
        test: /.vue$/,
        loader: "vue-loader"
      }
    ]
  },
  plugins: [
    // 請(qǐng)確保引入這個(gè)插件來(lái)施展魔法
    new VueLoaderPlugin(),
  ]
};

安裝 html 模板解析插件

npm i html-webpack-plugin --save-dev

// 當(dāng)前版本 
"html-webpack-plugin": "^3.2.0"

html 解析也屬于基本配置,歸入 base

// webpack.base.js

// ...省略號(hào)
// html插件
const HtmlWebpackPlugin = require("html-webpack-plugin");
module.exports = {
  //...省略號(hào)
  plugins: [
    //...省略號(hào)
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, "../index.html"),
    }),
  ]
};

創(chuàng)建 npm 命令

"scripts": {
  "start": "webpack-dev-server --hot --open --config build/webpack.dev.js",
  "build": "webpack --config build/webpack.prod.js"
},

--hot 模塊熱替換

--open 開(kāi)啟本地服務(wù)器

此時(shí) npm start,項(xiàng)目可正常運(yùn)行

3. 功能拓展

添加 loader

CSS loader (包括前處理和后處理)

CSS 基礎(chǔ) loader

"css-loader": "^1.0.0",
"style-loader": "^0.21.0",

CSS 前處理 less 兩件套

"less": "^3.8.0",
"less-loader": "^4.1.0",

CSS 前處理 sass 兩件套

"node-sass": "^4.9.2",
"sass-loader": "^7.1.0",

CSS 后處理 postcss 兩件套

"postcss-loader": "^2.1.6",
"autoprefixer": "^9.1.0",

并在根文件夾創(chuàng)建 postcss.config.js 文件

// postcss.config.js
// 自動(dòng)添加css兼容屬性
module.exports = {
  plugins: [
    require("autoprefixer")
  ]
}

安裝以上依賴,在 base 文件中加入一下 loader 代碼

// webpack.base.js

// ...省略號(hào)
rules: [
  {
    test: /.(sa|sc|c)ss$/,
    use: [
      "style-loader",
      "css-loader",
      "postcss-loader",
      "sass-loader",
    ],
  },
  {
    test: /.less$/,
    use: [
      "style-loader",
      "css-loader",
      "postcss-loader",
      "less-loader",
    ],
  },
]

圖片 loader

解析圖片,字體等都是用 file-loader,安裝npm i file-loader --save-dev

base 文件加入配置

// webpack.base.js

// ...省略號(hào)
rules: [
  // ...省略號(hào)
  {
    test: /.(png|svg|jpg|gif)$/,
    use: [
      {
        loader: "file-loader",
        options: {
          limit: 5000,
          // 分離圖片至imgs文件夾
          name: "imgs/[name].[ext]",
        }
      },
    ]
  },
]
4. 打包優(yōu)化

解決每次重新打包,dist 文件夾文件未清除

安裝 clean-webpack-plugin 插件

// webpack.prod.js

// 打包之前清除文件
const CleanWebpackPlugin = require("clean-webpack-plugin");
// ...省略號(hào)
plugins: [
  new CleanWebpackPlugin(["dist/*"], {
    root: path.resolve(__dirname, "../")
  }),
]

分離 CSS

webpack4 中使用 mini-css-extract-plugin 插件來(lái)分離 css。

安裝 mini-css-extract-plugin 插件后

// webpack.prod.js

// 分離CSS插件
const MiniCssExtractPlugin = require("mini-css-extract-plugin");
// ...省略號(hào)
plugins: [
  new MiniCssExtractPlugin({
    filename: "css/[name].[hash].css",
    chunkFilename: "css/[id].[hash].css"
  }),
]

另外,還需將各個(gè) css loader中的style-loader 替換為 MiniCssExtractPlugin

圖片壓縮使用 image-webpack-loader, 安裝后
代碼如下:

// webpack.prod.js
// ...省略號(hào)
rules: [
  {
    test: /.(sa|sc|c)ss$/,
    use: [
      {
        loader: MiniCssExtractPlugin.loader,
        options: {
          // you can specify a publicPath here
          // by default it use publicPath in webpackOptions.output
          publicPath: "../"
        }
      },
      "css-loader",
      "postcss-loader",
      "sass-loader",
    ],
  },
  {
    test: /.less$/,
    use: [
      {
        loader: MiniCssExtractPlugin.loader,
        options: {
          // you can specify a publicPath here
          // by default it use publicPath in webpackOptions.output
          publicPath: "../"
        }
      },
      "css-loader",
      "postcss-loader",
      "less-loader",
    ],
  },
  {
    test: /.(png|svg|jpg|gif)$/,
    use: [
      {
        loader: "file-loader",
        options: {
          limit: 5000,
          name: "imgs/[hash].[ext]",
        }
      },
      // 圖片壓縮
      {
        loader: "image-webpack-loader",
        options: {
          //   bypassOnDebug: true,
          mozjpeg: {
            progressive: true,
            quality: 65
          },
          optipng: {
            enabled: false,
          },
          pngquant: {
            quality: "65-90",
            speed: 4
          },
          gifsicle: {
            interlaced: false,
          }
        },
      },
    ]
  },
]

使用 happypack 多進(jìn)程加快編譯速度

同時(shí)也需要安裝 babel 兩件套

"babel-core": "^6.26.3",
"babel-loader": "^7.1.5",
"happypack": "^5.0.0",

happypack 開(kāi)發(fā)生產(chǎn)環(huán)境都用到,配置歸入 base

// webpack.base.js
// 使用happypack
const HappyPack = require("happypack");
const os = require("os");
const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length });
// ...省略號(hào)
rules: [
  {
    test: /.js$/,
    //把對(duì).js 的文件處理交給id為happyBabel 的HappyPack 的實(shí)例執(zhí)行
    loader: "happypack/loader?id=happyBabel",
    //排除node_modules 目錄下的文件
    exclude: /node_modules/
  },
]

分離不常變化的文件,如 node_modules 下引用的庫(kù)

// webpack.prod.js
module.exports = merge(common, {
  // ...省略號(hào)
  optimization: {
    // 分離chunks
    splitChunks: {
      chunks: "all",
      cacheGroups: {
        vendor: {
          name: "vendor",
          test: /[/]node_modules[/]/,
          priority: 10,
          chunks: "initial" // 只打包初始時(shí)依賴的第三方
        },
      }
    },
  },
})

如此配置,則打包的 js 文件夾中會(huì)多一個(gè) vendor.js

壓縮CSS和JS代碼

安裝 optimize-css-assets-webpack-plugin 和 uglifyjs-webpack-plugin 插件

// webpack.prod.js
// 壓縮CSS和JS代碼
// ...省略號(hào)
const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin");
const UglifyJsPlugin = require("uglifyjs-webpack-plugin");
module.exports = merge(common, {
  // ...省略號(hào)
  optimization: {
    // ...省略號(hào)
    minimizer: [
      // 壓縮JS
      new UglifyJsPlugin({
        uglifyOptions: {
          compress: {
            warnings: false, // 去除警告
            drop_debugger: true, // 去除debugger
            drop_console: true // 去除console.log
          },
        },
        cache: true, // 開(kāi)啟緩存
        parallel: true, // 平行壓縮
        sourceMap: false // set to true if you want JS source maps
      }),
      // 壓縮css
      new OptimizeCSSAssetsPlugin({})
    ]
  },
})

最后,再拓展一個(gè) hash, chunkhash, contenthash 的區(qū)別

hash是跟整個(gè)項(xiàng)目的構(gòu)建相關(guān),只要項(xiàng)目里有文件更改,整個(gè)項(xiàng)目構(gòu)建的hash值都會(huì)更改,并且全部文件都共用相同的hash值

chunkhash和hash不一樣,它根據(jù)不同的入口文件(Entry)進(jìn)行依賴文件解析、構(gòu)建對(duì)應(yīng)的chunk,生成對(duì)應(yīng)的哈希值。

contenthash 更細(xì)致地根據(jù)內(nèi)容更改,生成對(duì)應(yīng)的哈希值。解決chunkhash 文件中引入的文件名因 chunkhash 變動(dòng)而變動(dòng)的問(wèn)題

項(xiàng)目源碼

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

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

相關(guān)文章

  • webpack4 的開(kāi)發(fā)環(huán)境配置說(shuō)明

    摘要:的開(kāi)發(fā)環(huán)境配置說(shuō)明完整的的配置地址開(kāi)發(fā)環(huán)境的搭建,總體而言就比較輕松,因?yàn)橛脩艟褪情_(kāi)發(fā)者們。的做法是在的字段配置類(lèi)似這樣這樣配置后,當(dāng)運(yùn)行時(shí),在里通過(guò)可以取到值以來(lái)做判斷就可以啦。 webpack4 的開(kāi)發(fā)環(huán)境配置說(shuō)明 完整的webpack4的配置clone地址: https://github.com/ziwei3749/... 開(kāi)發(fā)環(huán)境的搭建,總體而言就比較輕松,因?yàn)橛脩艟褪情_(kāi)發(fā)者們...

    fancyLuo 評(píng)論0 收藏0
  • 為什么我不推薦你使用vue-cli創(chuàng)建腳手架?

    摘要:后來(lái)經(jīng)過(guò)排查你會(huì)發(fā)現(xiàn)是由于目前還沒(méi)有版本。可以使用該方式解決。這就是我為什么不推薦你使用創(chuàng)建腳手架的原因此文的受眾是想要進(jìn)階中級(jí)的初級(jí)前端人員。 最近在知乎看到一個(gè)問(wèn)題,原問(wèn)題如下: 很奇怪,為什么現(xiàn)在能找到自己手動(dòng)創(chuàng)建vue腳手架的文章非常少,而且大家似乎對(duì)webpack4的熱情并不高,對(duì)于想基于vue2.0+webpack4搭建一個(gè)腳手架的我來(lái)說(shuō)資料真是少得可憐。難道現(xiàn)在一般的做...

    trigkit4 評(píng)論0 收藏0
  • 關(guān)于Vue2一些值得推薦的文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...

    sutaking 評(píng)論0 收藏0
  • 關(guān)于Vue2一些值得推薦的文章 -- 五、六月份

    摘要:五六月份推薦集合查看最新的請(qǐng)點(diǎn)擊集前端最近很火的框架資源定時(shí)更新,歡迎一下。蘇幕遮燎沈香宋周邦彥燎沈香,消溽暑。鳥(niǎo)雀呼晴,侵曉窺檐語(yǔ)。葉上初陽(yáng)乾宿雨,水面清圓,一一風(fēng)荷舉。家住吳門(mén),久作長(zhǎng)安旅。五月漁郎相憶否。小楫輕舟,夢(mèng)入芙蓉浦。 五、六月份推薦集合 查看github最新的Vue weekly;請(qǐng)::點(diǎn)擊::集web前端最近很火的vue2框架資源;定時(shí)更新,歡迎 Star 一下。 蘇...

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

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

0條評(píng)論

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