个人实测
个人亲测,代码无问题,顺着md文件执行下去。就可以实现,原理非常简单。非常棒的方式。
以下为转载的正文:
最近接到了一个运营需求 在页面中植入不同的活动弹窗 还需要经常替换 本来思考的方案是写在本地 每次有新活动再发版 但是这种方案有一个问题就是对于单页应用来说如果用户不重新进入页面或者刷新页面 是无法重新向服务器请求资源的 而产品的意思是只要广告发布后用户进入页面就需要展示最新的活动内容 以后还有可能展示随机活动 并有可能频繁替换 so 经过研究我们实现了一种远程加载资源的方式 可以完美的实现运营需求 那么我们是怎么实现的呢?且听我慢慢道来
纠结之路
首先我和另一位开发小伙伴的思路出现了巨大分歧 他的思路是做一个lowcode的简单搭建平台 然后通过约定的JSON Schema的格式定义组件内容去渲染 这也是大部分lowcode平台的做法
我强烈反对的原因是因为我们的页面可能会有复杂的交互逻辑 lowcode平台无法实现太过于复杂的逻辑内容 于是这个方案被pass 我提出了另一个方案 就是通过使用带compiler的vue runtime来实现对template的加载 类似于这种形式
经过一番实验我们发现这个方案也有很多用着不太爽的地方 比如字符串形式的template和只能使用行内样式 这让我俩感觉后边的维护之路边的异常艰难 所以我们又想到了另一个方案 那就是能不能直接使用.vue的sfc文件去加载呢?但是浏览器是无法识别和加载.vue文件的 那么我们可不可以通过webpack直接把组件打包成一个js文件加载到页面里呢?于是我们开始了探究之路
首先我们查看了vite和webpack两个方案的实现可能性 vite是基于rollup实现 我们使用rollup进行了测试
页面成功地被打包了
但是这里有一个很大的问题
一个单文件的Vue组件被打包成了css和js两个文件 并且css的scoped失效了 这完全不能满足我们的需求 我们也基本翻遍了使用的插件的各种文档也没有办法把css和js打包进一个文件 如果去看源码耗时又太久 于是这个方案暂时pass (但是如果使用的是vue2的话 这个方案是可行的 因为rollup-plugin-vue打包出来默认是单文件)
于是我们使用webpack进行了新的尝试 使用vue官方的vue-loader进行尝试 webpack配置如下
const { VueLoaderPlugin } = require("vue-loader");
const path = require("path");
module.exports = {
entry: path.resolve(__dirname, "./app.vue"),
externals: {
vue: "Vue",
},
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./dist"),
library: "MyPlugin",
libraryTarget: "umd",
},
plugins: [
// 引入插件
new VueLoaderPlugin(),
],
optimization: {
minimize: false,
},
module: {
rules: [
// vue
{
test: /\.vue/,
use: ["vue-loader"],
},
// JS
{
test: /\.m?js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: "babel-loader",
options: {
presets: [
// 开始
[
"@babel/preset-env",
{
useBuiltIns: "usage",
corejs: {
version: 3,
}
},
],
// 结束
],
},
},
},
// CSS
{
test: /\.css$/,
use: ["style-loader", "css-loader"],
},
// Images
{
test: /\.(jpg|png|gif|svg)$/,
use: [
{
loader: "file-loader",
options: {
outputPath: "assets/images/",
},
},
],
},
// Fonts
{
test: /\.(ttf|eot|woff|woff2)$/,
use: [
{
loader: "file-loader",
options: {
outputPath: "assets/fonts/",
},
},
],
},
],
},
};
webpack打包由于我们没有使用 css extract plugin所以生成的就是单个文件
那么这个方案能不能行的通呢? 我们放到浏览器试一下 webpack配置的library就是我们最终注入到页面的变量名 我们访问一下试试看
ok 完全没有问题 那么我们能不能正确的把组件显示在页面上呢?我们尝试把这个组件挂载到页面上
oh yeah 成功的加载到了页面上 并且样式和功能完全可用 至此我们的方案就完美的实现了 探究的过程我也写了一份简单的实例代码放在了GitHub 大家可以跑起来自己试验一下
后续我们也可能会继续的完善这个方案 希望对大家有所帮助
链接
原文地址:chasingdream.cn/article?id=…
git地址:github.com/webfanzc/re…