美文网首页大前端vue.js前端开发工具
使用Vue-cli搭建多页面应用时对项目结构和配置的调整

使用Vue-cli搭建多页面应用时对项目结构和配置的调整

作者: 大春春 | 来源:发表于2017-05-07 15:47 被阅读18622次

前提:在这里使用的是webpack模板进行搭建

第一步、安装Vue-cli并且进行初始化

首先打开git,在里面使用npm全局安装Vue-cli,并且进行初始化
npm i vue-cli -g
然后使用vue init <template(模板名,我这里使用的是webpack)> <项目文件夹名称(我这里使用的是project)>初始化一个Vue项目模板
vue init webpack project
之后在模板下载时候会弹出如下配置选项



配置好后按下回车就构建完成了Vue脚手架,之后cd进入项目,并且进行node模块的安装npm i
cd project&&npm i
这时候Vue-cli的准备工作就完成了,这时候可以通过npm run dev进入开发环境,启动后是这个样子的,但是此时的脚手架的配置都是针对单页面应用进行的,入口只有一个index.html,所以下一步就要对项目目录的结构进行一些调整

第二步、对项目目录进行一些调整

我们主要针对的是src目录进行调整,首先来看看调整前的项目目录结构


调整前的项目目录结构

进入src文件夹中,新建一个文件夹,取名pages,用于存放页面文件,然后在pages里面新建一个文件夹叫index用于存放首页,然后将下图红框内的文件(文件夹)都拉进index文件夹里面,还有最外层的index.html也拉进去




这时候的src文件夹里面只有两个文件夹一个是components用于存放组件文件,pages用于存放页面,然后新建一个modules文件夹用于存放自己写的页面模块

最后进入index文件夹,将里面的main.js改成index.js,保证页面的入口js文件和模板文件的名称一致
这时候的项目目录结构接调整完毕了

第三步、对相应的配置文件进行修改

  • 首先进入build文件夹下的utils文件中进行修改



    在utils文件中添加两个函数

// glob是webpack安装时依赖的一个第三方模块,还模块允许你使用 *等符号, 例如lib/*.js就是获取lib文件夹下的所有js后缀名的文件
var glob = require('glob')
    // 页面模板
var HtmlWebpackPlugin = require('html-webpack-plugin')
// 取得相应的页面路径,因为之前的配置,所以是src文件夹下的pages文件夹
var PAGE_PATH = path.resolve(__dirname, '../src/pages')
    // 用于做相应的merge处理
var merge = require('webpack-merge')


//多入口配置
// 通过glob模块读取pages文件夹下的所有对应文件夹下的js后缀文件,如果该文件存在
// 那么就作为入口处理
exports.entries = function() {
    var entryFiles = glob.sync(PAGE_PATH + '/*/*.js')
    var map = {}
    entryFiles.forEach((filePath) => {
        var filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
        map[filename] = filePath
    })
    return map
}

//多页面输出配置
// 与上面的多页面入口配置相同,读取pages文件夹下的对应的html后缀文件,然后放入数组中
exports.htmlPlugin = function() {
    let entryHtml = glob.sync(PAGE_PATH + '/*/*.html')
    let arr = []
    entryHtml.forEach((filePath) => {
        let filename = filePath.substring(filePath.lastIndexOf('\/') + 1, filePath.lastIndexOf('.'))
        let conf = {
            // 模板来源
            template: filePath,
            // 文件名称
            filename: filename + '.html',
            // 页面模板需要加对应的js脚本,如果不加这行则每个页面都会引入所有的js脚本
            chunks: ['manifest', 'vendor', filename],
            inject: true
        }
        if (process.env.NODE_ENV === 'production') {
            conf = merge(conf, {
                minify: {
                    removeComments: true,
                    collapseWhitespace: true,
                    removeAttributeQuotes: true
                },
                chunksSortMode: 'dependency'
            })
        }
        arr.push(new HtmlWebpackPlugin(conf))
    })
    return arr
}
  • 修改build/webpack.base.conf.js的入口配置



    找到这一段,并且修改为



  • 修改build/webpack.dev.conf.js(开发环境)和build/webpack.prod.conf.js(生产环境)的多页面配置
    1.开发环境build/webpack.dev.conf.js


    找到该段并且注释掉,然后在后面添加.concat(utils.htmlPlugin())

    2.生产环境webpack.prod.conf.js

    注释掉这段,并且在后面添加.concat(utils.htmlPlugin())

第四步、对页面应用配置已基本完成,进行测试

这时候可以在pages里面添加一个test文件夹,在test文件夹里面创建一个html文件作为测试页面



然后重新npm run dev打开开发环境,在路径中输入test.html,如果能进入test页面,那么就多页面应用的配置就成功了

附章:关于多页面输出配置函数中的chunks: ['manifest', 'vendor', filename]

第一个vendor模块是指node_modules中的功用模块
第二个manifest是指针对vendor模块所做的缓存

github链接请点

相关文章

网友评论

  • james_5b63:你好,按照这个设置,我项目都跑不起来了
  • BAN_5304:大佬还在不 我这 报了个错 找不出问题在哪额
    TypeError: arguments[i].apply is not a function
    at Compiler.apply (E:\fangtoto_m\node_modules\tapable\lib\Tapable.js:375:16)
    at webpack (E:\fangtoto_m\node_modules\webpack\lib\webpack.js:33:19)
    at startDevServer (E:\fangtoto_m\node_modules\webpack-dev-server\bin\webpack-dev-server.js:367:16)
    at processOptions (E:\fangtoto_m\node_modules\webpack-dev-server\bin\webpack-dev-server.js:350:5)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
    at Function.Module.runMain (module.js:695:11)
    at startup (bootstrap_node.js:191:16)
    at bootstrap_node.js:612:3
  • 媛_5907:大佬,我检查了很多遍了,一直报这个错
    Failed to compile.

    ./src/main.js
    Module build failed: Error: ENOENT: no such file or directory, open 'F:\vueCase\vue00\src\main.js'
    @ multi (webpack)-dev-server/client?http://localhost:8080 webpack/hot/dev-server ./src/main.js
    媛_5907:@媛_5907 大佬,有没有配置test路由的demo,我按照index的配置路由的方式,没有任何作用,拜托大佬,看到能回复,最近要做一个多页面的后台页面!:pray:
    媛_5907:@大春春 再次检查了一遍,原来把文件名pages写成page上。低级错误,谢谢大佬!:blush:
    大春春:@媛_5907 你看看是不是路径问题,报错信息是模块没找到的意思
  • Nora_Jianshu:modules 文件夹有什么用??页面模块怎么理解?
  • Timid_a1db:请问一下多个页面需要多个vue实例吗
  • 莫言_jc:我还以为是把后缀为.vue的文件当作一个页面了,看了看居然不是的。。我做的事后台管理系统,就一个index页面,其他的都是vue文件,这样可以吗,有什么问题??
  • 林肯公园_97cc:为什么我运行npm run dev后默认是直接跳转到test页面呢,如何设置默认跳转路径页面
  • d4a41519402c:test.html出不来
    YMF_WX1981:解决了没?朋友?
  • cyfour:你好 请问如果用webpack3的话 怎么配置呢
  • 点点滴滴_3205:怎么配置test的vue啊,
  • 7cb6a0c9870a:楼主666
  • 73845c45d2c7:非常详细~非常感谢~给的代码就改了下路径就直接能用了
  • 小丸子138:直接clone下代码跑,切换至test.html页面好像不成功,虽然地址变了,页面内容还行index.html的内容:confounded:
    YMF_WX1981:同问
    d4a41519402c:你的问题解决了吗
  • a4f94d42c9d5:下载完dom 果断start 没有废代码,是我想要的。
  • 5ca9d1c37990:这样的话有个问题,那就是用户每打开一个新页面,都会去下载一个大于1M的js_bundle。有无一些优化方案。
    翌子涵:他们引用的mainfest.[hash].js和vendor.[hash].js是同一个,所以第二次引用时会读取缓存。
  • Kay_bcb0:有个疑问:假如有n个页面,如果其中一个页面修改的话重新编译也会把所有的页面重新都打包一次吗?如果是这样那么在页面多的情况打包速度会是一个不得不考虑的问题
  • 4a676ffedf49:修改之后不会自动热更新
    fb53f6c4556e:什么原因啊
    4a676ffedf49:睡了一觉拿着你的github参考在撸,结果就好了:innocent:
  • 6e5ecb7935a9:打包以后,css文件和js文件找不到了
  • 梓胤:大佬怎么配置test的vue 文件?? 求赐教
    点点滴滴_3205:请问你配置出来了吗
  • 8b032bdc5994:test页面里面怎么配置vue,我按照index里面的配置报错了 额
  • ajax一叶扁舟:好了 谢谢啊,主要是我写错了 我的原因
  • ajax一叶扁舟:说我webpack_merge connot find module
    灰常饿:什么原因呀
  • ajax一叶扁舟:请问我这个为什么报错呢、
  • ontheway_3151:请教一下:npm run dev没问题, build的时候就报错了啊,也没错误信息。git clone下来的代码也是这样。求教下作者怎么解决
    君莫叹人生如若初见:@destiny_d550 请问一下你写出来了吗,我也想问这个问题。如果不Build得话好像不能再服务器那边上。
    15b8416db5fb:要是想npm run bulid 的话还需要怎么写
    大春春:@ontheway_3151 build报错的原因是我没有去写npm script,这个项目的话run dev起来就可以了,只是做个测试的,不需要build
  • 9091f7c0bfea:求问一下,多页面路由怎样配置的,不是只有一个test.html那样简单的一个页面
    7cb6a0c9870a:和 pages/index文件夹里面的内容一样,只需要把这些文件的名字都改成test即可
  • 三言gg:你好我想问下,在多页面的情况下,肯定有一些css和JS是通用的,我想单独摘出来单独引入而不是都打包到一起,应该修改哪个配置文件?
  • 9091f7c0bfea:十分感谢,真的帮助很多
  • d6f8846a89cf:为什么我做两个页面没问题,三个之后就 Cannot GET 了?
    d6f8846a89cf:@东水电费 非常感谢你,按你的说法已经解决问题了:stuck_out_tongue_winking_eye:
    9091f7c0bfea:重新运行npm run dev
  • 我只是1个追梦孩子:最好加一个github的demo地址
    d7d907d4cda7:@吟小面 谢谢,试了一下果断star
    e23b408120af:可以参考这个最新的demo 根据vue-cli修改而来 https://github.com/bnaohaore/morepagecli
    大春春:@我只是1个追梦孩子 github地址已经给出在文章最后面了
  • MonaSong:请问下,多个单页的话,路由怎么配置呢?是否可以给出样例代码:smile:
    ajax一叶扁舟:@大春春 我也想要
    大春春:@MonaSong 额 因为最近都在做单页面的应用,所以对多页面路由的配置并不了解,现在还不能给出代码,过一段时间研究一下给出博客和代码后再@你吧
    大春春:@MonaSong 我这边配置一下 晚点会给出一个github地址和博客出来的

本文标题:使用Vue-cli搭建多页面应用时对项目结构和配置的调整

本文链接:https://www.haomeiwen.com/subject/touutxtx.html