成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

webpack4系列教程(九):開發(fā)環(huán)境和生產(chǎn)環(huán)境

姘存按 / 3109人閱讀

摘要:它允許在運(yùn)行時(shí)更新各種模塊,而無需進(jìn)行完全刷新。構(gòu)建生產(chǎn)環(huán)境開發(fā)環(huán)境和生產(chǎn)環(huán)境的構(gòu)建目標(biāo)差異很大。在開發(fā)環(huán)境中,我們需要具有強(qiáng)大的具有實(shí)時(shí)重新加載或熱模塊替換能力的和。

1. 構(gòu)建開發(fā)環(huán)境

如果你一直跟隨我前面的博文,那么你對webpack的基礎(chǔ)知識已經(jīng)有比較深刻的理解了。之前,我們一直執(zhí)行著:

npm run build

來打包編譯輸出我們的代碼,本文我們來看看如何構(gòu)建一個開發(fā)環(huán)境,來使我們的開發(fā)變得方便些。

1.1 webpack-dev-server

webpack-dev-server是一個簡單的小型的web服務(wù)器,并且能夠?qū)崟r(shí)重載,配置也很簡單,首先安裝:

npm install --save-dev webpack-dev-server

配置webpack.config.js:

devServer: {
    port: 8080,  // 端口號
    host: "0.0.0.0", // 主機(jī)名,設(shè)為該值可通過IP訪問
    overlay: {
      errors: true // 錯誤提示
    }
  }

在package.json中添加命令:

    "dev": "cross-env NODE_ENV=development webpack-dev-server --config config/webpack.config.js"

執(zhí)行:

npm run dev

可見我們的服務(wù)已經(jīng)跑起來了:

1.2 source-map

在webpack打包源碼時(shí),我們會很難找到錯誤的出現(xiàn)位置,比如將源文件 sum.js、minus.js打包到bundle.js中,其中一個源文件出現(xiàn)了錯誤,僅僅會追蹤到bundle.js中,這對我們來說并不理想。因此為了更加便捷的找到錯誤的原始位置,JavaScript為我們提供了 source-map的功能,將編譯后的代碼映射回原始源代碼。如果一個錯誤來自于 sum.js,source map 就會明確的告訴你。

我們來測試一下,在sum.js中輸出一個錯誤:

// ES Mudule 規(guī)范
export default function (a, b) {
  console.error("this is test") // 輸出錯誤
  return a + b
}

在沒有devtool配置的情況下 npm run dev,會發(fā)現(xiàn)錯誤提示的行數(shù)并不準(zhǔn)確,

原因是我們的代碼是被編譯過的

然后在webpack.config.js中加入配置:

  devtool: "inline-source-map", // 加入devtool配置

當(dāng)配置文件改動時(shí)需要重新執(zhí)行 npm run dev:

錯誤提示行數(shù)以及源碼映射都是正確的。devtool的取值有很多,大家可根據(jù)需要自行配置

1.3 模塊熱替換
模塊熱替換(Hot Module Replacement)是 webpack 提供的最有用的功能之一。它允許在運(yùn)行時(shí)更新各種模塊,而無需進(jìn)行完全刷新。

使用非常簡單,在webpack.config.js中引入webpack:

  const webpack = require("webpack")

在plugins數(shù)組中添加:

  new webpack.NamedModulesPlugin(),
  new webpack.HotModuleReplacementPlugin()

給devServer中的hot屬性設(shè)為true:

devServer: {
    port: 8080,  // 端口號
    host: "0.0.0.0", // 主機(jī)名,設(shè)為該值可通過IP訪問
    overlay: {
      errors: true // 錯誤提示
    },
    hot: true
  }

這樣我們修改代碼的時(shí)候就可以局部刷新模塊而不是刷新整個頁面了。

2.構(gòu)建生產(chǎn)環(huán)境
開發(fā)環(huán)境(development)和生產(chǎn)環(huán)境(production)的構(gòu)建目標(biāo)差異很大。在開發(fā)環(huán)境中,我們需要具有強(qiáng)大的、具有實(shí)時(shí)重新加載(live reloading)或熱模塊替換(hot module replacement)能力的 source map 和 localhost server。而在生產(chǎn)環(huán)境中,我們的目標(biāo)則轉(zhuǎn)向于關(guān)注更小的 bundle,更輕量的 source map,以及更優(yōu)化的資源,以改善加載時(shí)間。由于要遵循邏輯分離,我們通常建議為每個環(huán)境編寫彼此獨(dú)立的 webpack 配置。

雖然,以上我們將生產(chǎn)環(huán)境和開發(fā)環(huán)境做了略微區(qū)分,但是,請注意,我們還是會遵循不重復(fù)原則(Don"t repeat yourself - DRY),保留一個“通用”配置。為了將這些配置合并在一起,我們將使用一個名為 webpack-merge 的工具。通過“通用”配置,我們不必在環(huán)境特定的配置中重復(fù)代碼。

我們先從安裝 webpack-merge 開始,用來合并webpack配置項(xiàng):

npm install --save-dev webpack-merge

在config文件夾下創(chuàng)建 webpack.dev.js 和 webpack.build.js 并修改 webpack.config.js,將開發(fā)與生產(chǎn)環(huán)境的公共配置放在webpack.config.js中:

const path = require("path")
const HtmlWebpackPlugin = require("html-webpack-plugin")
const MiniCssExtractPlugin = require("mini-css-extract-plugin")

const isDev = process.env.NODE_ENV === "development"

const config = {
  entry: {
    main: path.join(__dirname, "../src/main.js")
  },
  output: {
    filename: "[name].bundle.js",
    path: path.join(__dirname, "../dist")
  },
  module: {
    rules: [
      {
        test: /.(vue|js|jsx)$/,
        loader: "eslint-loader",
        exclude: /node_modules/,
        enforce: "pre"
      },
      {
        test: /.js$/,
        loader: "babel-loader",
        exclude: /node_modules/
      },
      {
        test: /.vue$/,
        loader: "vue-loader",
        options: createVueLoaderOptions(isDev)
      },
      {
        test: /.ejs$/,
        use: ["ejs-loader"]
      },
      {
        test: /.css$/,
        use: [
          isDev ? "vue-style-loader" : MiniCssExtractPlugin.loader,
          { loader: "css-loader", options: { importLoaders: 1 } },
          "postcss-loader"
        ]
      },
      {
        test: /.less$/,
        use: [
          isDev ? "vue-style-loader" : MiniCssExtractPlugin.loader,
          "css-loader",
          {
            loader: "postcss-loader",
            options: {
              sourceMap: true
            }
          },
          "less-loader"
        ]
      },
      {
        test: /.(jpg|jpeg|png|gif|svg)$/,
        use: [
          {
            loader: "url-loader",
            options: {
              name: "[path][name]-[hash:5].[ext]",
              limit: 1024
            }
          }
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.join(__dirname, "../index.html"),
      inject: true,
      minify: {
        removeComments: true
      }
    })
  ]
}

module.exports = config

webpack.dev.js

const merge = require("webpack-merge")
const common = require("./webpack.config.js")

module.exports = merge(common, {
  mode: "development",
  devtool: "inline-source-map",
  devServer: {
    port: 8080,
    host: "0.0.0.0",
    overlay: {
      errors: true
    },
    historyApiFallback: {
      index: "/index.html"
    }
  }
})

webpack.build.js

const path = require("path")
const CleanWebpackPlugin = require("clean-webpack-plugin")
const MiniCssExtractPlugin = require("mini-css-extract-plugin")
const merge = require("webpack-merge")
const common = require("./webpack.config.js")

module.exports = merge(common, {
  mode: "production",
  optimization: {
    splitChunks: {
      chunks: "initial",
      automaticNameDelimiter: ".",
      cacheGroups: {
        commons: {
          name: "commons",
          chunks: "initial",
          minChunks: 2,
          priority: 3
        },
        vendors: {
          test: /[/]node_modules[/]/,
          priority: 1
        }
      }
    },
    runtimeChunk: {
      name: entrypoint => `manifest.${entrypoint.name}`
    }
  },
  plugins: [
    new MiniCssExtractPlugin({
      filename: "[name].css"
    }),
    new CleanWebpackPlugin(
      ["dist"],
      {
        root: path.join(__dirname, "../")
      }
    )
  ]
})

修改package.json的命令:

"dev": "cross-env NODE_ENV=development webpack-dev-server --config config/webpack.dev.js",
"build": "cross-env NODE_ENV=production webpack --config config/webpack.build.js --progress --inline --colors"

現(xiàn)在分別執(zhí)行 npm run dev 和 npm run build 就會得到你想要的了。

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101169.html

相關(guān)文章

  • webpack4系列教程(十):總結(jié)

    摘要:傳送門系列教程一初識系列教程二創(chuàng)建項(xiàng)目,打包第一個文件系列教程三自動生成項(xiàng)目中的文件系列教程四處理項(xiàng)目中的資源文件一系列教程五處理項(xiàng)目中的資源文件二系列教程六使用分割代碼系列教程七使用系列教程八使用審查代碼系列教程九開發(fā)環(huán)境和生產(chǎn)環(huán)境 在前端開發(fā)日益復(fù)雜的今天,我們需要一個工具來幫助我們管理項(xiàng)目資源,打包、編譯、預(yù)處理、后處理等等。webpack的出現(xiàn)無疑是前端開發(fā)者的福音,我的博文只...

    hqman 評論0 收藏0
  • webpack4 系列教程(): CSS Tree Shaking

    摘要:按照我們的仿真的環(huán)境,最終之后的效果應(yīng)該是打包后的文件不含有樣式類。如果忘記了它的用法,請查看系列教程六處理系列教程五處理所以,我們的文件如下安裝完相關(guān)插件后,我們需要在的配置中引用第三部分定義的代碼。 教程所示圖片使用的是 github 倉庫圖片,網(wǎng)速過慢的朋友請移步 原文地址 有空就來看看個人技術(shù)小站, 我一直都在 0. 課程介紹和資料 本次課程的代碼目錄(如下圖所示):s...

    趙連江 評論0 收藏0
  • webpack4 系列教程(): CSS Tree Shaking

    摘要:按照我們的仿真的環(huán)境,最終之后的效果應(yīng)該是打包后的文件不含有樣式類。如果忘記了它的用法,請查看系列教程六處理系列教程五處理所以,我們的文件如下安裝完相關(guān)插件后,我們需要在的配置中引用第三部分定義的代碼。 教程所示圖片使用的是 github 倉庫圖片,網(wǎng)速過慢的朋友請移步 原文地址 有空就來看看個人技術(shù)小站, 我一直都在 0. 課程介紹和資料 本次課程的代碼目錄(如下圖所示):s...

    superw 評論0 收藏0
  • webpack-demos:全網(wǎng)最貼心webpack系列教程配套代碼

    摘要:全網(wǎng)最貼心系列教程和配套代碼歡迎關(guān)注個人技術(shù)博客。所以我花費(fèi)了個多月整理了這份教程,一共分成節(jié),每節(jié)都有講解,并且準(zhǔn)備了配套代碼。奈何深感水平不夠,只有一腔熱情,所以直接開放了教程和源碼。 webpack-demos:全網(wǎng)最貼心 webpack 系列教程和配套代碼 歡迎關(guān)注個人技術(shù)博客:godbmw.com。每周 1 篇原創(chuàng)技術(shù)分享!開源教程(webpack、設(shè)計(jì)模式)、面試刷題(偏前...

    LMou 評論0 收藏0
  • webpack4 系列教程(十二):處理第三方JavaScript庫

    摘要:教程所示圖片使用的是倉庫圖片,網(wǎng)速過慢的朋友請移步系列教程十二處理第三方庫原文地址。因?yàn)檎巾?xiàng)目中,由于需要的依賴過多,掛載到對象的庫,很容易發(fā)生命名沖突問題。會先從安裝的包中查找是否有符合的庫。證明在中使用的和都成功指向了庫。 教程所示圖片使用的是 github 倉庫圖片,網(wǎng)速過慢的朋友請移步《webpack4 系列教程(十二):處理第三方 JavaScript 庫》原文地址?;蛘邅?..

    leonardofed 評論0 收藏0

發(fā)表評論

0條評論

姘存按

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<