资讯专栏INFORMATION COLUMN

多页面应用的前端架构

eternalshallow / 3035人阅读

摘要:解决方案一在一个项目中,使用配置多个文件来实现多页面应用存在的利弊配置简单打包效率低下灵活性差需要维护多个文件解决方案二采用使用统一维护每个项目的并为头部注入用户信息,并且多带带构建一个项目,统一维护第三方依赖。

前提

数据管理平台包含了多个后台项目,后台项目均使用vue作为开发框架。

子项目存在公共头部,需要统一管理维护。

子项目存在公共的依赖(如vuevuexvue-router等),公共依赖包可以统一维护。

子项目存在公共存在公共的配置文件例如postcss.config.js需要统一维护。

解决方案一
在一个项目中,使用entry配置多个html文件来实现多页面应用

存在的利弊:

配置简单

打包效率低下

灵活性差

需要维护多个html文件

解决方案二(采用)
使用thinkjs统一维护每个项目的template.html,并为头部注入用户信息,并且多带带构建一个common项目,统一维护第三方依赖。

存在的利弊:

配置繁琐

打包效率高

灵活性好

只需维护一个html文件

项目目录
├─src
│  ├─bootstrap
│  ├─config
│  ├─controller
│  ├─logic
│  └─model
├─view
│  └─index                            //模板文件目录
└─vue_project                                
    |—package.json                    //统一维护所有依赖
    ├─asset_manage                    //子项目目录
    ├─common                        //打包公共组件项目
    ├─postcss.config.js             //公用的配置文件
配置介绍 common配置介绍

打包主要配置介绍:

插件 描述
webpack.DllPlugin vendor依赖中的库、文件打包(依赖的库取的是package.dependencies的值)
extract-text-webpack-plugin css多带带提取出来,打包成一个.css文件
assets-webpack-plugin webpack.DllPlugin打包生成的文件的文件名保存为一个.json文件。方便子项目引用。
optimize-css-assets-webpack-plugin 压缩打包后的.css文件
module.exports = {
    mode: "production",
    entry: {
        vendor: [...Object.keys(package.dependencies), "./css/element-css/index.css", "./css/index.postcss"],
    },
    devtool: "source-map",
    output: {
        path: path.join(__dirname, "../vendor"),
        filename: "dll.[name]_[hash:6].js",
        library: "[name]_[hash:6]"
    },
    module: {
        rules: [{
                test: /.css$/,
                use: ExtractTextPlugin.extract({
                    fallback: "style-loader",
                    use: "css-loader"
                })
            },
            {
                test: /.postcss$/,
                use: ExtractTextPlugin.extract({
                    fallback: "style-loader",
                    use: [{
                        loader: "css-loader",
                        options: {
                            importLoaders: 1
                        }
                    }, "postcss-loader", ]
                })
            },
            {
                test: /.(woff2?|eot|ttf|otf)(?.*)?$/,
                use: "url-loader"
            },
        ]
    },
    plugins: [
        new webpack.DllPlugin({
            path: path.join(__dirname, "../vendor", "[name]-manifest.json"),
            name: "[name]_[hash:6]",
            context: path.join(__dirname, "../../"), // 执行的上下文环境,对之后DllReferencePlugin有用
        }),
        new ExtractTextPlugin("[name]_[hash:6].css"),
        new AssetsPlugin({
            filename: "bundle-config.json",
            path: path.join(__dirname, "../vendor")
        }),
        new OptimizeCssAssetsPlugin({
            assetNameRegExp: /.css$/g,
            cssProcessor: require("cssnano"),
            cssProcessorOptions: {
                parser: require("postcss-safe-parser"),
                discardComments: {
                    removeAll: true
                },
            },
            canPrint: true
        })
    ]
}
vue-cli3配置介绍
vue-cli3的配置文件被封装在了npm模块@vue/cli-service 中可使用vue inspect > output.js进行查看
插件 描述
webpack.DllReferencePlugin 将第三方依赖的索引id与对应的第三方依赖具体位置告知webpack
add-asset-html-webpack-plugin common中生成的bundle-config.json文件中的依赖文件注入html-webpack-plugin的模板中
const webpackConfig = {
    configureWebpack: {
        plugins: [
            new webpack.DllReferencePlugin({
                context: path.join(__dirname, "../../"),
                manifest
            }),
            new AddAssetHtmlPlugin([{
                    filepath: require.resolve(`../vendor/${bundleConfig.vendor.js}`),
                    includeSourcemap: false
                },
                {
                    typeOfAsset: "css",
                    filepath: require.resolve(`../vendor/${bundleConfig.vendor.css}`),
                    includeSourcemap: false
                }
            ])
        ]
    },
    chainWebpack: config => {
        config.resolve.alias.store.delete("vue$");
        config.plugin("copy").tap(args => {
            args[0][0].from = "./public";
            args[0][0].to = "public";
            args[0][0].ignore = [".*"];
            return args;
        });
        config.plugin("define").tap(args => {
            args[0]["process.env"]["BUILD_ENV"] = """ + process.env.BUILD_ENV + """;
            return args;
        });
        config.module.rule("postcss").oneOf("vue").use("postcss").loader("postcss-loader").options({
            config: {
                path: path.join(__dirname, "../../")
            }
        });
    },
}
依赖统一管理
如果各自项目的打包依赖分布在各自项目中,依然会增加维护成本以及依赖安装的打包成本

这里就需要理解node查找依赖的逻辑。通过module.paths可以看到node查找依赖时的,顺序

[ "E:datamanagementvue_projectasset_manage
epl
ode_modules",
  "E:datamanagementvue_projectasset_manage
ode_modules",
  "E:datamanagementvue_project
ode_modules",
  "E:datamanagement
ode_modules",
  "E:
ode_modules",
  "C:Users18044854.node_modules",
  "C:Users18044854.node_libraries",
  "C:Program Files
odejslib
ode" ]

node会从当前目录的node_modules一级一级的向上查找,
所以我们只需要将所有依赖安装在common和vue的父级目录即可

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

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

相关文章

  • 前端进阶之路: 前端架构设计(3) - 测试核心

    摘要:而测试驱动开发技术并不只是单纯的测试工作。需求向来就是软件开发过程中感觉最不好明确描述易变的东西。这里说的需求不只是指用户的需求,还包括对代码 可能很多人和我一样, 首次听到前端架构这个词, 第一反应是: 前端还有架构这一说呢? 在后端开发领域, 系统规划和可扩展性非常关键, 因此架构师备受重视, 早在开发工作启动之前, 他们就被邀请加入到项目中, 而且他们会跟客户讨论即将建成的平台的...

    Karuru 评论0 收藏0
  • 前端进阶之路: 前端架构设计(3) - 测试核心

    摘要:而测试驱动开发技术并不只是单纯的测试工作。需求向来就是软件开发过程中感觉最不好明确描述易变的东西。这里说的需求不只是指用户的需求,还包括对代码 可能很多人和我一样, 首次听到前端架构这个词, 第一反应是: 前端还有架构这一说呢? 在后端开发领域, 系统规划和可扩展性非常关键, 因此架构师备受重视, 早在开发工作启动之前, 他们就被邀请加入到项目中, 而且他们会跟客户讨论即将建成的平台的...

    宋华 评论0 收藏0
  • 前端 —— 理论篇

    摘要:现在开始从头搭建我们的微前端架构。项目源码微前端项目微前端微前端项目 1. 微前端         基于spa类的单页应用,随着企业工程项目的体积越来越大,开发的功能越来越多,页面也越来越多,项目随之也变得越来越臃肿,维护起来十分困难,往往改一个logo,或者改一个小样式,都要将项目全部重新打包一遍,维护困难,部署也困难。         因此前端在借鉴后端的微服务架构模式后,衍生了...

    wangbinke 评论0 收藏0
  • webpack应用架构系列(一):一步一步解决架构痛点

    摘要:本文首发于的技术博客实用至上,非经作者同意,请勿转载。原文地址如果您对本系列文章感兴趣,欢迎关注订阅这里这系列文章讲什么本系列文章主要介绍如何用这一当前流行的构建工具来设计一个多页应用的架构。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/1190000006843916如果您对本系列文章...

    Lowky 评论0 收藏0
  • webpack应用架构系列(十五):论前端如何在后端渲染开发模式下夹缝生存

    摘要:回到纯静态页面开发阶段,让页面不需要后端渲染也能跑起来。改造开始本文着重介绍如何将静态页面改造成后端渲染需要的模板。总结在后端渲染的项目里使用多页应用架构是绝对可行的,可不要给老顽固们吓唬得又回到传统前端架构了。 本文首发于Array_Huang的技术博客——实用至上,非经作者同意,请勿转载。原文地址:https://segmentfault.com/a/119000000820338...

    dinfer 评论0 收藏0

发表评论

0条评论

eternalshallow

|高级讲师

TA的文章

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