美文网首页web前端vue.jsvue
基于vue-cli单页面脚手架改造的多页面项目

基于vue-cli单页面脚手架改造的多页面项目

作者: jarvan4dev | 来源:发表于2016-08-24 23:57 被阅读6751次

    了解了Vue一般都会去用Vue-cli入门,这是一个构建SPA的脚手架,查看其build的项目,可以看到它是将所有的模块都输出到一个build.js中,有时候会看到这个js文件特别大,有好几兆,然而当一个项目足够复杂时,SPA恐怕不再适合使用了,用户不可能访问你的网页的时候一下子下载一个几兆的文件,特别对于手机用户,可能用户只看了网站中的一篇文章,这也会导致网页加载慢,这是不可取的。所以应该将网站划分成若干模块。于是就有了本demo(一个用于构建多页面的脚手架)

    如何开始?

    假设你已经熟悉了vue-cli了😄

    1. 创建项目

      vue init webpack vue-multi-page
      # 为了简便可以不用jslint等
      
    2. 开始改造

      最主要的一步,将webpack进行改造以满足对多页面需求的支持,其实多页面,即是webpack有多个入口。在此步中,我们主要的操作的对象是 build文件夹下的js文件。

      • 首先,我们对 utils.js进行改造
        添加一个方法:getEntries,方法中需要使用到node的globa模块,所以需要引入

        // glob模块,用于读取webpack入口目录文件
        

    var glob = require('glob');

            
            ```javascript
            exports.getEntries = function (globPath) {
      var entries = {}
      /**
       * 读取src目录,并进行路径裁剪
       */
      glob.sync(globPath).forEach(function (entry) {
        /**
         * path.basename 提取出用 ‘/' 隔开的path的最后一部分,除第一个参数外其余是需要过滤的字符串
         * path.extname 获取文件后缀
         */
        var basename = path.basename(entry, path.extname(entry), 'router.js') // 过滤router.js
        // ***************begin***************
        // 当然, 你也可以加上模块名称, 即输出如下: { module/main: './src/module/index/main.js', module/test: './src/module/test/test.js' }
        // 最终编译输出的文件也在module目录下, 访问路径需要时 localhost:8080/module/index.html
        // slice 从已有的数组中返回选定的元素, -3 倒序选择,即选择最后三个
        // var tmp = entry.split('/').splice(-3)
        // var pathname = tmp.splice(0, 1) + '/' + basename; // splice(0, 1)取tmp数组中第一个元素
        // console.log(pathname)
        // entries[pathname] = entry
        // ***************end***************
        entries[basename] = entry
      });
      // console.log(entries);
      // 获取的主入口如下: { main: './src/module/index/main.js', test: './src/module/test/test.js' }
      return entries;
    }
            ```
        + 其次,对webpack.base.conf.js进行改造
            
            删除 ~~entry: {app: './src/main.js'},~~,取而代之如下:
    
            ```javascript
            module.exports = {
                ···
                entry: utils.getEntries('./src/module/**/*.js'),
            ```
        + 最后改造webpack.dev.conf.js和webpack.prod.conf.js
            
            移除原来的HtmlWebpackPlugin
            
            ```javascript
            var pages = utils.getEntries('./src/module/**/*.html')
    for(var page in pages) {
      // 配置生成的html文件,定义路径等
      var conf = {
        filename: page + '.html',
        template: pages[page], //模板路径
        inject: true,
        // excludeChunks 允许跳过某些chunks, 而chunks告诉插件要引用entry里面的哪几个入口
        // 如何更好的理解这块呢?举个例子:比如本demo中包含两个模块(index和about),最好的当然是各个模块引入自己所需的js,
        // 而不是每个页面都引入所有的js,你可以把下面这个excludeChunks去掉,然后npm run build,然后看编译出来的index.html和about.html就知道了
        // filter:将数据过滤,然后返回符合要求的数据,Object.keys是获取JSON对象中的每个key
        excludeChunks: Object.keys(pages).filter(item => {
          return (item != page)
        })
      }
      // 需要生成几个html文件,就配置几个HtmlWebpackPlugin对象
      module.exports.plugins.push(new HtmlWebpackPlugin(conf))
    }
            ```
            
    ## 构建步骤
    
            ``` bash
            # 安装依赖
            npm install
            # 本地测试
            npm run dev
            # 打包
            npm run build
            
            ```
    在本地调试启动后访问:[index](http://localhost:8080) | [about](http://localhost:8080/about.html) 即可
    
    ## 源码
    [我的github](https://github.com/jarvan4dev/vue-multi-page)

    相关文章

      网友评论

      • 吃不胖的茶叶蛋:大哥 你的markdown排版乱了 看着好难受 希望修复一下
      • 柠檬树__:写的非常好
      • 小小的帅气:帮了大忙,教程言简意赅,之前改别人的框架给改崩了。
      • 355af8a659cf:我这边按照你提供的方法做的,执行npm run dev可以本地调试,但是执行npm run build,报错,报错:“TypeError: Cannot read property 'push' of undefined”,也就是webpack.prod.conf.js中倒数第二行报错了:module.exports.plugins.push(new HtmlWebpackPlugin(conf))。我的vue版本是2.3.3,请问这是什么原因?
        355af8a659cf:解决了,应该是vue或者webpack的版本不一样,把vue 2.3.3版本生成的webpack.prod.conf.js第14行改成“module.exports = merge(baseWebpackConfig, {”就可以了
      • 方克己:webpack 构建的vue-cli是按需加载的,与文件大小无关 无关紧要的
      • 1f521f33141c:为什么 我和你一样的改造 但是 打包后没有html文件
        方克己:webpack就是把所有文件打包为一个js文件。
      • 93d01af5abe0:我想你应该没应用到项目中,在实际项目中肯定不允许这样搞得,按你这个模板来搞,我某个特面上要改一个文字,想想付出的代价有多大。应该在提供一个 `页面编译配置`的js,来获取到我这次需要编译那几个页面才合理
        jarvan4dev:@如果你听见我的歌 看了你的回复,很详尽,一起学习,谢谢
        93d01af5abe0:@Eason4dev 其实我觉得多页面一起编译这个思想就有点走偏了,官方提供是做单页面的脚手架,而我们真实项目中的多页面是指我们经过时间的积累可能要写很多个单页面,但不可能每个单页面都单独起一个项目,多页面的目的是把这些单页面放在一个项目中,实际开发中每次只需要开发单独的一个单页面,而不是一次性把所有页面都编译起来,比如今天我要开发index页面,那我就专注与index页面,我不去管什么about页面,home页面,我这次只要把index页面开发完,然后build完,提交,今天工作完成。而不是我开发着index页面,这边还起着about页面,我修改了index页面用得js,最后编译的时候也顺手把about页面也编译了一下,但是about页面有可能不是你维护的,搞不好编译之后about页面又变化了什么东西,别的同事来找你,为啥动我的页面,搞出这些扯皮的事情,其实多页面实际上就是我这个脚手架可以把单页面组合在一块处理,这个时候这几个页面可能会有一些公共的东西需要复用,这个就是另外一个问题了
        jarvan4dev: @如果你听见我的歌 这种编译应该不耗什么时间把?就像Java
      • 8b3bf93cf02b: “用户不可能访问你的网页的时候一下子下载一个几兆的文件” ,构建spa合一很轻松的配置按需加载,特别在 vue + webpack 的时候,只需在当前路由页面加在当前所需的js,以及共用js;
        jarvan4dev:@A阿城 我不清楚这个按需加载,因为我看的的编译出来的html文件直接引入了一个很大的js文件,这个是很令人吃惊的
      • Flippancy:有的时候spa太大了,考虑一下分多个页面也不错。
      • df1ea0ab38b9:不错,我拿来改造了一下,用在项目里面了

      本文标题:基于vue-cli单页面脚手架改造的多页面项目

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