zoukankan      html  css  js  c++  java
  • vue-cli webpack多Html页面的配置(附框架vue-webpack-multipage实例)

    产生原因:

    目前使用Vue的Web应用越来越多,包括很多手机App都使用Vue来开发前端。但是使用官方的vue-cli webpack仅仅是单页面,一个大一点的项目一个页面往往是不够的。那么vue-cli能不能支持多Html页面呢?答案是可以的,那就需要我们去改动一下webpack的配置。

    简介:

    我把它取了个名字叫做vue-webpack-multipage,顾名思义:vue基于webpack的多页面框架。我同时会给大家讲如何基于官方的vue-cli webpack的demo上改动,也会把我修改过后的demo上传到git共享给大家(但是不保证模块是最新的,所以大家最好跟着教程自己配置一下)。在之前呢,我参考了其他大佬的一些方法,然后自己总结了一下,并进行了优化。可以支持多级目录,至于多少级呢,这个是不限制的,所以个人认为还是比较智能的。本教程涉及到vue-cli原有支持需要你们自己查阅哦。

    配置教程:

    前置条件你已经熟悉了vue-cli

    1.创建项目

    //就是你使用官方vue-cli的用法
    vue init webpack 项目名

    2.添加多页面帮助工具:这是封装的各种多页面支持的方法,我命名为multipage-helper.js,放在项目的build文件夹下

    /**
     * 多页面支持
     * @File:
     * @Description: 多页面支持
     * @author qingyi xuelongqy@foxmail.com
     * @date 2017/6/15 10:16
     * @version V1.0
     */
    
    var path = require('path')
    var fs = require("fs")
    var HtmlWebpackPlugin = require('html-webpack-plugin')
    
    var moduleList          //缓存多页面模块列表
    var moduleRootPath = './src/module' //模块根目录(这个可以根据自己的需求命名)
    
    /**
     * 获取js入口数组
     */
    exports.getEntries = function getEntries(){
      //缓存js入口数组
      var entries = {}
      //初始化模块列表
      this.getModuleList()
      //变量模块列表
      moduleList.forEach(function (module) {
        if (module.moduleID != "" && module.moduleJS != ""){
          entries[module.moduleID] = module.moduleJS
        }
      })
      console.log("*********************************** entries ***********************************")
      console.log(entries)
      return entries
    }
    
    /**
     * 获取多页面模块列表
     * @returns {模块的信息集合}
     */
    exports.getModuleList = function getModuleList() {
      //判断是否为空,不为空则直接返回
      if (moduleList){
        return moduleList
      }else {//为空则读取列表
        moduleList = new Array();
        readDirSync(moduleRootPath, "")
        console.log("*********************************** moduleList ***********************************")
        console.log(moduleList)
        return moduleList
      }
    }
    
    /**
     * 获取dev的Html模板集合
     * @returns {dev的Html模板集合}
     */
    exports.getDevHtmlWebpackPluginList = function getDevHtmlWebpackPluginList(){
      console.log("*********************************** devHtmlWebpackPluginList ***********************************")
      //缓存dev的Html模板集合
      var devHtmlWebpackPluginList = []
      //获取多页面模块集合
      var moduleList = this.getModuleList()
      //遍历生成模块的HTML模板
      moduleList.forEach(function (mod) {
        //生成配置
        var conf = {
          filename: mod.moduleID+".html",
          template: mod.moduleHTML,
          chunks: [mod.moduleID],
          inject: true
        }
        console.log(conf)
        //添加HtmlWebpackPlugin对象
        devHtmlWebpackPluginList.push(new HtmlWebpackPlugin(conf))
      })
      return devHtmlWebpackPluginList
    }
    
    /**
     * 获取prod的Html模板集合
     * @returns {prod的Html模板集合}
     */
    exports.getProdHtmlWebpackPluginList = function getProdHtmlWebpackPluginList(){
      console.log("*********************************** prodHtmlWebpackPluginList ***********************************")
      //缓存dev的Html模板集合
      var prodHtmlWebpackPluginList = []
      //获取多页面模块集合
      var moduleList = this.getModuleList()
      //遍历生成模块的HTML模板
      moduleList.forEach(function (mod) {
        //生成配置
        var conf = {
          filename: mod.moduleID+".html",
          template: mod.moduleHTML,
          inject: true,
          minify: {
            removeComments: true,
            collapseWhitespace: true,
            removeAttributeQuotes: true
            // more options:
            // https://github.com/kangax/html-minifier#options-quick-reference
          },
          // necessary to consistently work with multiple chunks via CommonsChunkPlugin
          chunksSortMode: 'dependency',
          chunks: ['manifest','vendor',mod.moduleID]
        }
        console.log(conf)
        //添加HtmlWebpackPlugin对象
        prodHtmlWebpackPluginList.push(new HtmlWebpackPlugin(conf))
      })
      return prodHtmlWebpackPluginList
    }
    
    /**
     * 深度遍历目录,并整理多页面模块
     * @param path 需要变量的路径
     * @param moduleName 模块名称
     */
    function readDirSync(path,moduleName){
      //缓存模块对象
      var module = {moduleID:"",moduleHTML:"",moduleJS:""}
      //获取当前模块ID
      var moduleID = path.replace(moduleRootPath+"/","")
      if (path == moduleRootPath){
        moduleID = ""
      }
      module.moduleID = moduleID
      //获取目录下所有文件及文件夹
      var pa = fs.readdirSync(path)
      pa.forEach(function(ele,index){
        var info = fs.statSync(path+"/"+ele)
        if(info.isDirectory()){
          // console.log("dir: "+ele)
          readDirSync(path+"/"+ele, ele)
        }else{
          //判断当前模块的html是否存在
          if (moduleName+".html" == ele){
            module.moduleHTML = path+"/"+ele
          }
          //判断当前模块的js是否存在
          if (moduleName+".js" == ele){
            module.moduleJS = path+"/"+ele
          }
          // console.log("file: "+ele)
        }
      })
      //判断模块是否真实(可能只是个分级目录)
      if ((module.moduleID != "" && module.moduleHTML != "") || (module.moduleID != "" && module.moduleJS != "")){
        moduleList.push(module)
      }
    }

    3.修改webpack.base.conf.js:配置多个页面的js入口

    //**添加**
    //引入多页面支持
    var multipageHelper = require('./multipage-helper')
    
    //**修改**
    module.exports = {
      entry: multipageHelper.getEntries(), //设置入口集合
      ...
    }

     4.修改webpack.dev.conf.js:开发时的多页面模板配置

    //**添加**
    //引入多页面支持
    var multipageHelper = require('./multipage-helper')
    
    //**删除**
    //删除module.exports中原有的HtmlWebpackPlugin配置(内容可能不一样,反正HtmlWebpackPlugin就对了)
    new HtmlWebpackPlugin({
    filename: 'index.html',
    template: 'index.html',
    inject: true
    })
    
    //**末尾添加**
    //添加Html模板集合
    Array.prototype.push.apply(module.exports.plugins,multipageHelper.getDevHtmlWebpackPluginList())

    5.修改webpack.prod.conf.js:编译时的多页面模板配置

    //**添加**
    //引入多页面支持
    var multipageHelper = require('./multipage-helper')
    
    //**删除**
    //删除webpackConfig中原有的HtmlWebpackPlugin配置(内容可能不一样,反正HtmlWebpackPlugin就对了)
    new HtmlWebpackPlugin({
      filename: config.build.index,
      template: 'index.html',
      inject: true,
      minify: {
        removeComments: true,
        collapseWhitespace: true,
        removeAttributeQuotes: true
        // more options:
        // https://github.com/kangax/html-minifier#options-quick-reference
      },
      // necessary to consistently work with multiple chunks via CommonsChunkPlugin
      chunksSortMode: 'dependency'
    })
    
    //**末尾添加**
    //添加Html模板集合
    Array.prototype.push.apply(module.exports.plugins,multipageHelper.getProdHtmlWebpackPluginList())

    6.目录结构及其使用:目录结构有点讲究,一说就懂

    看图说话

     

     我把所有的页面放在了module下,这个呢是可以修改的(multipage-helper.js的moduleRootPath变量)

    我用commodity_info来举例

    • commodity_info.js vue的入口文件(以前的main.js)
    • commodity_info.html 这就是一个Html页面(以前的index.html)
    • commodity_info.vue vue的视图文件(以前的App.vue)

    其实没啥好说的,就是每个页面需要的文件封装到同一个文件夹内。

    需要注意的是:上面三个文件名需要和文件夹名字相同

    编译后文件的路径:会把整个文件夹的内容打包成一个html。怎么理解呢?我举个例子就懂了,还是commodity_info,最后会编译为/commodity/commodity_info.html;如果是resources就是/resources.html;如果是book就是/resources/book.html。So easy!!

    多级目录:通过上面你就知道很人性化的支持了多目录结构了。它会一个一个目录去遍历,查找是否有和目录名字相同的js、html和vue。

    vue-webpack-multipage框架实例源码:

    如果你不太理解怎么用,去看看代码就知道啦。

    项目地址(码云):https://git.oschina.net/xuelongqy/vue-webpack-multipage.git

    github地址:https://github.com/xuelongqy/vue-webpack-multipage.git

    演示地址:http://114.215.136.14/VueMulti/

     

    特别重要:

    如果你支持我的话,记得在码云上捐赠我哦!!!

    如果你有问题,或者想跟我讨论,留言吧。也可以到我的微博:http://weibo.com/xuelongqy

  • 相关阅读:
    Django安装和启动
    转载:Python 包管理工具解惑
    电子商务的基本理念
    javascript的循环使用
    错误码
    weex初始
    Flex 布局
    css样式重置表
    手机端页面自适应解决方案—rem布局
    实用的60个CSS代码片段[下]
  • 原文地址:https://www.cnblogs.com/xuelongqy/p/7081419.html
Copyright © 2011-2022 走看看