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

資訊專欄INFORMATION COLUMN

webpack打包多頁面

voyagelab / 1704人閱讀

摘要:創建打包路徑利用這個方法,我們可以獲得需要打包的文件路徑方法中獲取文件路徑的模塊也可使用模塊,根據獲得打包的文件路徑,我們可以使用來實現多頁面打包。

前言

一開始接觸webpack是因為使用Vue的關系,因為Vue的腳手架就是使用webpack構建的。剛開始的時候覺得webpack就是為了打包單頁面而生的,后來想想,這么好的打包方案,只在單頁面上使用是否太浪費資源了呢?如果能在傳統多頁面上使用webpack,開始效率是否會事半功倍呢?好在眾多優秀的前端開發者已經寫了許多demo和文章供人學習。我也寫了一個小項目,希望對大家學習webpack有幫助。

好吧其實上面說的都是廢話,接下來附上項目地址和干貨,配合食用更佳。

webpack-multi-page

項目解決的問題

SPA好復雜,我還是喜歡傳統的多頁應用怎么破?又或是,我司項目需要后端渲染,頁面模板怎么出?

每個頁面相同的UI布局好難維護,UI稍微改一點就要到每個頁面去改,好麻煩還容易漏,怎么破?

能不能整合進ESLint來檢查語法?

能不能整合postcss來加強瀏覽器兼容性?

我可以使用在webpack中使用jquery嗎?

我可以使用在webpack中使用typescript嗎?

src目錄對應dist目錄

當我們使用webpack打包多頁面,我們希望src目錄對應打包后dist目錄是如上圖這樣的,開發根據頁面模塊的思路搭建開發架構,然后經過webpack打包,生成傳統頁面的構架。

/**
 * 創建打包路徑
 */
const createFiles = function() {
  const usePug = require("../config").usePug;
  const useTypeScript = require("../config").useTypeScript;
  const path = require("path");
  const glob = require("glob");
  const result = [];
  const type = usePug ? "pug" : "html";
  const scriptType = useTypeScript ? "ts" : "js";
  const files = glob.sync(path.join(__dirname, `../src/views/**/*.${type}`));
  for (file of files) {
    result.push({
      name: usePug ? file.match(/w{0,}(?=.pug)/)[0] : file.match(/w{0,}(?=.html)/)[0],
      templatePath: file,
      jsPath: file.replace(type, scriptType),
      stylePath: file.replace(type, "stylus")
    });
  }
  return result;
};

利用這個方法,我們可以獲得需要打包的文件路徑(方法中獲取文件路徑的模塊也可使用fs模塊),根據獲得打包的文件路徑,我們可以使用html-webpack-plugin來實現多頁面打包。

由于每一個html-webpack-plugin的對象實例都只針對/生成一個頁面,因此,我們做多頁應用的話,就要配置多個html-webpack-plugin的對象實例:

const plugins = function() {
  const files = createFiles();
  const HtmlWebpackPlugin = require("html-webpack-plugin");
  const path = require("path");
  const ExtractTextPlugin = require("extract-text-webpack-plugin");

  let htmlPlugins = [];
  let Entries = {};
  files.map(file => {
    htmlPlugins.push(
      new HtmlWebpackPlugin({
        filename: `${file.name}.html`,
        template: file.templatePath,
        chunks: [file.name]
      })
    );
    Entries[file.name] = file.jsPath;
  });

  return {
    plugins: [
      ...htmlPlugins,
      new ExtractTextPlugin({
        filename: getPath => {
          return getPath("css/[name].css");
        }
      })
    ],
    Entries
  };
};

由于我使用了ExtractTextPlugin,因此這些CSS代碼最終都會生成到所屬chunk的目錄里成為一個CSS文件。

模版引擎
每個頁面相同的UI布局好難維護,UI稍微改一點就要到每個頁面去改,好麻煩還容易漏,怎么破?

考慮到這個問題,項目引進并使用了pug模版引擎。

現在,我們可以利用pug的特性,創建一個共用組件:

demo.pug

p 這是一個共用組件

然后,當你需要使用這個公用組件時可以引入進來:

include "demo.pug"

除此之外,你還可以使用一切pug特供的特性。

webpack中配置pug也很簡單,先安裝:

npm i --save-dev pug pug-html-loader

然后將所有.html后綴的改為.pug后綴,并且使用pug語法。

然后在規則中再增加一條配置

{
    test: /.pug$/,
    use: "pug-html-loader"
}

同時把plugins對象中的用到index.html的HtmlWebpackPlugin中的template,也要改成index.pug。

webpack整合eslint

先放出配置代碼:

if (useEslint) {
  loaders.push({
    test: /.js$/,
    loader: "eslint-loader",
    enforce: "pre",
    include: [path.resolve(__dirname, "src")],
    options: {
      formatter: require("stylish")
    }
  });
}

通過webpack整合ESLint,我們可以保證編譯生成的代碼都是沒有語法錯誤且符合編碼規范的;但在開發過程中,等到編譯的時候才察覺到問題可能也是太慢了點兒。

因此我建議可以把ESLint整合進編輯器或IDE里,像我本人在用vs code,就可以使用一個名為Eslint的插件,一寫了有問題的代碼,就馬上會標識出來。

dev環境與prod環境

首先,閱讀webpacl項目的時候通常要先看package.json這個文件。因為當你在命令行敲下一句命令

npm run dev

webpack就會找到package.json文件中的script屬性并依次分析命令,可見,這句命令相應的會執行

nodemon --watch build/ --exec "cross-env NODE_ENV=development  webpack-dev-server --color --progress --config build/webpack.dev.js"


同樣的,當寫下命令

npm run build

script就會執行

ross-env NODE_ENV=production webpack --config build/webpack.prod.js

這樣就能區分開發環境,或是生產環境了。

雖然我們會為環境做區分,但是基于不重復原則,項目為兩個環境公用的配置整合到了(build/webpack.base.js)文件中。然后利用webpack-merge插件將配置整合在一起

webpack中使用jquery

在webpack中使用jquery也很簡單,我們可以在loaders中增加一條配置:

if (useJquery) {
  loaders.push({
    // 通過require("jquery")來引入
    test: require.resolve("jquery"),
    use: [
      {
        loader: "expose-loader",
        // 暴露出去的全局變量的名稱 隨便你自定義
        options: "jQuery"
      },
      {
        // 同上
        loader: "expose-loader",
        options: "$"
      }
    ]
  });
}

然后當你需要在某個js文件使用jq時,引用暴露出來的變量名即可:

import $ from "jQuery";
webpack中使用typescript

在webpack中使用jquery也很簡單,我們可以在loaders中增加一條配置:

if (useTs) {
  loaders.push({
    test: /.tsx?$/,
    use: "ts-loader",
    exclude: /node_modules/
  });
}

然后將js文件改為ts即可。

后話

歡迎大家提pr,一起構建。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/53360.html

相關文章

  • webpack4+react頁面架構

    webpack在單頁面打包上應用廣泛,以create-react-app為首的腳手架眾多,單頁面打包通常是將業務js,css打包到同一個html文件中,整個項目只有一個html文件入口,但也有許多業務需要多個頁面不同的入口,比如不同的h5活動,或者需要支持seo的官方網站,都需要多個不同的html,webpack-react-multi-page架構讓你可以實現多頁面架構,在項目開發中保證每個頁面...

    liuyix 評論0 收藏0
  • webpack4+react頁面架構

    webpack在單頁面打包上應用廣泛,以create-react-app為首的腳手架眾多,單頁面打包通常是將業務js,css打包到同一個html文件中,整個項目只有一個html文件入口,但也有許多業務需要多個頁面不同的入口,比如不同的h5活動,或者需要支持seo的官方網站,都需要多個不同的html,webpack-react-multi-page架構讓你可以實現多頁面架構,在項目開發中保證每個頁面...

    Barrior 評論0 收藏0
  • webpack打包頁面

    摘要:創建打包路徑利用這個方法,我們可以獲得需要打包的文件路徑方法中獲取文件路徑的模塊也可使用模塊,根據獲得打包的文件路徑,我們可以使用來實現多頁面打包。 前言 一開始接觸webpack是因為使用Vue的關系,因為Vue的腳手架就是使用webpack構建的。剛開始的時候覺得webpack就是為了打包單頁面而生的,后來想想,這么好的打包方案,只在單頁面上使用是否太浪費資源了呢?如果能在傳統多頁...

    Allen 評論0 收藏0
  • webpack打包頁面

    摘要:創建打包路徑利用這個方法,我們可以獲得需要打包的文件路徑方法中獲取文件路徑的模塊也可使用模塊,根據獲得打包的文件路徑,我們可以使用來實現多頁面打包。 前言 一開始接觸webpack是因為使用Vue的關系,因為Vue的腳手架就是使用webpack構建的。剛開始的時候覺得webpack就是為了打包單頁面而生的,后來想想,這么好的打包方案,只在單頁面上使用是否太浪費資源了呢?如果能在傳統多頁...

    Jenny_Tong 評論0 收藏0

發表評論

0條評論

voyagelab

|高級講師

TA的文章

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