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

webpack打包多頁面的方法

 更新時(shí)間:2018年11月30日 10:40:46   作者:Choo  
這篇文章主要介紹了webpack打包多頁面的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

前言

一開始接觸webpack是因?yàn)槭褂肰ue的關(guān)系,因?yàn)閂ue的腳手架就是使用webpack構(gòu)建的。剛開始的時(shí)候覺得webpack就是為了打包單頁面而生的,后來想想,這么好的打包方案,只在單頁面上使用是否太浪費(fèi)資源了呢?如果能在傳統(tǒng)多頁面上使用webpack,開始效率是否會(huì)事半功倍呢?好在眾多優(yōu)秀的前端開發(fā)者已經(jīng)寫了許多demo和文章供人學(xué)習(xí)。我也寫了一個(gè)小項(xiàng)目,希望對大家學(xué)習(xí)webpack有幫助。

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

webpack-multi-page

項(xiàng)目解決的問題

  • SPA好復(fù)雜,我還是喜歡傳統(tǒng)的多頁應(yīng)用怎么破?又或是,我司項(xiàng)目需要后端渲染,頁面模板怎么出?
  • 每個(gè)頁面相同的UI布局好難維護(hù),UI稍微改一點(diǎn)就要到每個(gè)頁面去改,好麻煩還容易漏,怎么破?
  • 能不能整合進(jìn)ESLint來檢查語法?
  • 能不能整合postcss來加強(qiáng)瀏覽器兼容性?
  • 我可以使用在webpack中使用jquery嗎?
  • 我可以使用在webpack中使用typescript嗎?

src目錄對應(yīng)dist目錄

當(dāng)我們使用webpack打包多頁面,我們希望src目錄對應(yīng)打包后dist目錄是如上圖這樣的,開發(fā)根據(jù)頁面模塊的思路搭建開發(fā)架構(gòu),然后經(jīng)過webpack打包,生成傳統(tǒng)頁面的構(gòu)架。

/**
 * 創(chuàng)建打包路徑
 */
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;
};

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

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

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代碼最終都會(huì)生成到所屬chunk的目錄里成為一個(gè)CSS文件。

模版引擎

每個(gè)頁面相同的UI布局好難維護(hù),UI稍微改一點(diǎn)就要到每個(gè)頁面去改,好麻煩還容易漏,怎么破?

考慮到這個(gè)問題,項(xiàng)目引進(jìn)并使用了pug模版引擎。

現(xiàn)在,我們可以利用pug的特性,創(chuàng)建一個(gè)共用組件:

demo.pug

p 這是一個(gè)共用組件

然后,當(dāng)你需要使用這個(gè)公用組件時(shí)可以引入進(jìn)來:

include 'demo.pug'

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

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

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

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

然后在規(guī)則中再增加一條配置

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

同時(shí)把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,我們可以保證編譯生成的代碼都是沒有語法錯(cuò)誤且符合編碼規(guī)范的;但在開發(fā)過程中,等到編譯的時(shí)候才察覺到問題可能也是太慢了點(diǎn)兒。

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

dev環(huán)境與prod環(huán)境

首先,閱讀webpacl項(xiàng)目的時(shí)候通常要先看package.json這個(gè)文件。因?yàn)楫?dāng)你在命令行敲下一句命令

npm run dev

webpack就會(huì)找到package.json文件中的script屬性并依次分析命令,可見,這句命令相應(yīng)的會(huì)執(zhí)行

復(fù)制代碼 代碼如下:
nodemon --watch build/ --exec \"cross-env NODE_ENV=development webpack-dev-server --color --progress --config build/webpack.dev.js\"

同樣的,當(dāng)寫下命令

npm run build

script就會(huì)執(zhí)行

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

這樣就能區(qū)分開發(fā)環(huán)境,或是生產(chǎn)環(huán)境了。

雖然我們會(huì)為環(huán)境做區(qū)分,但是基于不重復(fù)原則,項(xiàng)目為兩個(gè)環(huán)境公用的配置整合到了(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: '$'
   }
  ]
 });
}

然后當(dāng)你需要在某個(gè)js文件使用jq時(shí),引用暴露出來的變量名即可:

import $ from 'jQuery';

webpack中使用typescript

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Ionic如何創(chuàng)建APP項(xiàng)目

    Ionic如何創(chuàng)建APP項(xiàng)目

    這篇文章主要介紹Ionic如何創(chuàng)建APP項(xiàng)目的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-06-06
  • js同源策略詳解

    js同源策略詳解

    這篇文章主要介紹了js同源策略,較為詳細(xì)的分析了javascript中同源策略的概念與相關(guān)應(yīng)用注意事項(xiàng),需要的朋友可以參考下
    2015-05-05
  • 將函數(shù)的實(shí)際參數(shù)轉(zhuǎn)換成數(shù)組的方法

    將函數(shù)的實(shí)際參數(shù)轉(zhuǎn)換成數(shù)組的方法

    實(shí)際參數(shù)在函數(shù)中我們可以使用 arguments 對象獲得 (注:形參可通過 arguments.callee 獲得),雖然 arguments 對象與數(shù)組形似,但仍不是真正意義上的數(shù)組。
    2010-01-01
  • 關(guān)于ExtJS4.1:快捷鍵支持的問題

    關(guān)于ExtJS4.1:快捷鍵支持的問題

    本篇文章小編為大家介紹,關(guān)于ExtJS4.1 快捷鍵支持的問題。需要的朋友參考下
    2013-04-04
  • 檢查輸入的是否是數(shù)字使用keyCode配合onkeypress事件

    檢查輸入的是否是數(shù)字使用keyCode配合onkeypress事件

    檢查輸入的是否是數(shù)字在本文使用keyCode配合onkeypress事件來實(shí)現(xiàn),具體示例如下
    2014-01-01
  • js jquery 獲取某一元素到瀏覽器頂端的距離實(shí)現(xiàn)方法

    js jquery 獲取某一元素到瀏覽器頂端的距離實(shí)現(xiàn)方法

    今天小編就為大家分享一篇js jquery 獲取某一元素到瀏覽器頂端的距離實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • 基于Three.js插件制作360度全景圖

    基于Three.js插件制作360度全景圖

    這篇文章主要介紹了基于Three.js插件制作的360度全景圖,代碼簡單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11
  • JavaScript防止表單重復(fù)提交的方法

    JavaScript防止表單重復(fù)提交的方法

    在web開發(fā)中,防止表單的重復(fù)提交是一個(gè)非常重要的環(huán)節(jié)。重復(fù)提交會(huì)導(dǎo)致數(shù)據(jù)混亂,甚至可能導(dǎo)致系統(tǒng)崩潰,今天我們將帶領(lǐng)大家從小白級別到大神級別的程序員,一起來學(xué)習(xí)如何在實(shí)際項(xiàng)目中避免表單的重復(fù)提交
    2023-04-04
  • js實(shí)現(xiàn)簡單翻牌小游戲

    js實(shí)現(xiàn)簡單翻牌小游戲

    這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡單翻牌小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • js 打開新頁面在屏幕中間的實(shí)現(xiàn)方法

    js 打開新頁面在屏幕中間的實(shí)現(xiàn)方法

    下面小編就為大家?guī)硪黄猨s 打開新頁面在屏幕中間的實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11

最新評論

利辛县| 水城县| 甘泉县| 和林格尔县| 厦门市| 崇阳县| 门头沟区| 丹东市| 枞阳县| 云阳县| 稻城县| 玉屏| 肥西县| 定襄县| 图片| 拜城县| 桐城市| 同江市| 苏尼特右旗| 尼勒克县| 灵山县| 黄骅市| 红河县| 木兰县| 苗栗市| 福鼎市| 阿合奇县| 清流县| 柘城县| 科技| 大连市| 万源市| 武川县| 浦县| 嘉义县| 瑞安市| 乡城县| 鹿邑县| 无锡市| 抚宁县| 温泉县|