资讯专栏INFORMATION COLUMN

【骨架屏】【vue】如何在webpack+vue+vue-cli下搭建多模块/单模块多路由骨架屏

huhud / 1216人阅读

摘要:如何在下搭建多模块单模块多路由骨架屏前言骨架屏的用户感知比更好,此前看过很多专栏以及文章,此次实践中还是遇到需要学习的部分。包括因为可能信息面不全,对插件源码进行了详细解读,希望对于将要在项目中搭建骨架屏的小伙伴们有所帮助。

如何在webpack+vue+vue-cli下搭建多模块/单模块多路由骨架屏 前言

骨架屏的用户感知比loading更好,此前看过很多专栏以及文章,此次实践中还是遇到需要学习的部分。
对于骨架屏或者占位符学习了Vue页面骨架屏注入实践,通过服务器渲染出静态页面,在js加载完之前进行首屏加载是感知比较合理的一个选择。

包括因为可能信息面不全,对插件源码进行了详细解读,希望对于将要在项目中搭建骨架屏的小伙伴们有所帮助。
此次使用的vue版本是2.4.5因此vue-server-renderer也需要使用同一个版本

参考的文章有

vue-skeleton-webpack-plugin骨架屏与page-skeleton-webpack-plugin骨架屏生成插件
基于vue和webpack的skeleton插件
以上参考文章里有注入骨架屏的原理与知识,在此就不搬运了,感谢以上巨人。
vue-skeleton-webpack-plugin插件GITHUB地址


引用的组件

vue-skeleton-webpack-plugin

主要利用这个骨架屏组件
以及他依赖的其他组件
此组件我使用1.22版本,最新的将插件提供的loader放到了非主要API部分,因此在本文章中未使用此loader,以防版本升级将此loader删去。

vue-server-renderer

   熟悉ssr的小伙伴对这个插件都不陌生,通过其API createBundleRenderer创建render进行渲染,具体参考[Vue页面骨架屏注入实践][5]。
   **注意点:vue与vue-server-renderer要使用同一个版本,否则会报错**

extract-text-webpack-plugin

  这也是比较重要的一个插件,如果你的脚手架没有对html与css进行分离,那么你的样式(除了内联样式以外)将无法被应用,后续将会对此讲解。

正文 如何配置多模块(多页面)骨架屏

在你的webpack配置文件的plugins 加入插件,为了节省性能我只在prod的时候进行plugins插入,开发模式配置以路由的模式进行开发,后续会详解。

webpackConfig.plugins.push(
    new SkeletonWebpackPlugin({
        webpackConfig: require("./webpack.skeleton.conf"), //主要的配置在个部分
        quiet: true,
        minimize: true,
        /**router: {
            mode: "hash",
            routes: skeletonPluginRoutes  //此部分配置是SPA(单页面)多路由脚手架配置
        }**/
    }));

webpack.skeleton.conf.js

...//以上常规配置不写明
let merge = require("webpack-merge");
let path = require("path")
let merge = require("webpack-merge")
let config = require("../config")
let utils = require("./utils")
let baseWebpackConfig = require("./webpack.base.conf")
let SkeletonWebpackPlugin = require("vue-skeleton-webpack-plugin");
let isProduction = process.env.NODE_ENV === "production";//判断是否是开发模式,是否需要开启样式分离
const sourceMapEnabled = isProduction ?
    config.build.productionSourceMap :
    config.dev.cssSourceMap;
    
//处理开发路径
function resolve(dir) {
    return path.join(__dirname, "..", dir)
}


let skeletonWebpackConfig = merge(baseWebpackConfig, {
    target: "node", //
    devtool: false,
    module: {},
    entry: {
       "key":"../entry-skeleton.js",//这是你骨架屏入口文件的map,注意这里的key必须与你在webpack里模块的入口文件相同
       "key":value,//对应的键值是你的骨架屏入口文件    
    },
    output: Object.assign({}, baseWebpackConfig.output, {
        libraryTarget: "commonjs2"
    }),
    plugins: []
});
//如果项目中没有样式与html的分离,可以扎到自己rules配置的.vue loader 进行开启
skeletonWebpackConfig.module.rules[1].options.loaders = utils.cssLoaders({
    sourceMap: sourceMapEnabled,
    extract: true
});
module.exports = skeletonWebpackConfig

配置此config文件最重要的

将entry文件的key与webpack的key进行配对

一定要将自己的css与HTML分离(如果出现无法载入样式的情况)

entry-skeleton.js

import Vue from "vue"
import homeSkeleton from "./home.skeleton.vue";
// import indexOverViewSkeleton from "./indexOverView.skeleton.vue";
export default new Vue({
    components: {
        homeSkeleton,
       // indexOverViewSkeleton
    },
    template: 
    `

只是简单的VUE入口文件,依旧要注意VUE的语法与规则,比如template只允许存在一个根元素

如何配置单页面多路由骨架屏
webpackConfig.plugins.push(
    new SkeletonWebpackPlugin({
        webpackConfig: require("./webpack.skeleton.conf"),
        quiet: true,
        minimize: true,
        router: {
            mode: "hash",
            routes: [{
               path:"/home",  //你希望这个路由页面时出现骨架屏
               skeletonId:"homeSkeleton",  //在skeleton入口文件里配置的id
               entryName:"key" //webpack打包时你入口文件的entryName,应与在plugin 入口文件一样的MAPkey一致
            },{
               path:"/main",  //你希望这个路由页面时出现骨架屏
               skeletonId:"mainSkeleton",  //在skeleton入口文件里配置的id
               entryName:"key" //webpack打包时你入口文件的entryName,应与在plugin 入口文件一样的MAPkey一致
            },]
        }
    }));

entry-skeleton.js

import Vue from "vue"
import homeSkeleton from "./home.skeleton.vue";
import indexOverViewSkeleton from "./indexOverView.skeleton.vue";
export default new Vue({
    components: {
        homeSkeleton,
        indexOverViewSkeleton
    },
    template: 
    `
` });
配置中需要注意的几点

1、保持自己的entryName,config里entryKey与webpack脚手架入口文件的key一致
2、开启样式分离!!!!!!!!重要的事情说三遍
3、因为插件经历了几个版本的更新,目前版本是接受loader的,但配置已经扁平化,所以建议不适用插件提供的loader配置。
4、省去了笔者部分根据脚手架配置的自动获取入口的代码,使用手写的,减少配置,能够让脚手架做的事情,我们就不要做了哦!!!笔者的建议。

这篇小小的笔记先介绍配置文件吧~~~希望对大家有所帮助,也很感谢网上的各位码字作者提供的思路。
看了插件的源码思路也很清晰,对于骨架屏的原理有了更深的理解。
鸭,到点去敷面膜了,希望自己有一天也可以开源一款前端插件,成为皮肤最好的前端。哈哈哈哈哈哈。


文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/54702.html

相关文章

  • 骨架】【vue如何webpack+vue+vue-cli搭建模块/模块路由骨架

    摘要:如何在下搭建多模块单模块多路由骨架屏前言骨架屏的用户感知比更好,此前看过很多专栏以及文章,此次实践中还是遇到需要学习的部分。包括因为可能信息面不全,对插件源码进行了详细解读,希望对于将要在项目中搭建骨架屏的小伙伴们有所帮助。 如何在webpack+vue+vue-cli下搭建多模块/单模块多路由骨架屏 前言 骨架屏的用户感知比loading更好,此前看过很多专栏以及文章,此次实践中还是...

    MkkHou 评论0 收藏0
  • 给项目加一个骨架

    摘要:给项目加一个骨架屏吧骨架屏可以理解为是当数据还未加载进来前,页面的一个空白版本,一个简单的关键渲染路径。安装过程中报错提示如下执行这个命令使用我这个项目是基于脚手架开发的。 给项目加一个骨架屏吧 骨架屏可以理解为是当数据还未加载进来前,页面的一个空白版本,一个简单的关键渲染路径。用户会看到一个样式简单,描绘了当前页面的大致框架的骨架屏页面,然后骨架屏中各个占位部分被实际资源完全替换,这...

    jeffrey_up 评论0 收藏0
  • 《从零构建前后分离的web项目》实战 -5分钟快速构建炒鸡规范的VUE项目骨架

    摘要:可以使用或来安装我用来重新尝试一次对速度表示不理想的可以尝试淘宝的不要过度依赖中可以写成放哪都行,可以写成可以写成看到这个画面,安装完成了。 初步搭建脚手架 Tips 任何不错的开源项目都有 project-cli 脚手架、我们用它生成往往能快速配制出最佳的、理想的脚手架 我通常使用 cli 生成项目骨架再在之基础上进行个人修改。 什么是 CLI 命令行界面(英语:command-li...

    qieangel2013 评论0 收藏0
  • 《从零构建前后分离的web项目》实战 -5分钟快速构建炒鸡规范的VUE项目骨架

    摘要:可以使用或来安装我用来重新尝试一次对速度表示不理想的可以尝试淘宝的不要过度依赖中可以写成放哪都行,可以写成可以写成看到这个画面,安装完成了。 初步搭建脚手架 Tips 任何不错的开源项目都有 project-cli 脚手架、我们用它生成往往能快速配制出最佳的、理想的脚手架 我通常使用 cli 生成项目骨架再在之基础上进行个人修改。 什么是 CLI 命令行界面(英语:command-li...

    kel 评论0 收藏0

发表评论

0条评论

huhud

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<