UMD 模块 vs CJS 模块

使用方式

UMD, window 全局注册后,直接使用


<!DOCTYPE html>
<html lang="zh-Hans">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta name="author" content="xgqfrms">
<meta name="generator" content="VS code">
<title>xyz demo 2</title>
<!-- 引入样式 -->
<link rel="stylesheet" href="https://unpkg.com/element-ui@2.14.1/lib/theme-chalk/index.css">
<link rel="stylesheet" href="./xyz.css">
</head>
<body>
<main>
<div id="vue_app">
<section>
<xyz-hello :msg="author"></xyz-hello>
<xyz-message :msg="msg"></xyz-message>
<!-- <br />
<Hello :msg="author"></Hello>
<Message :msg="msg"></Message> -->
<!-- element-ui -->
<el-row>
<el-button>默认按钮</el-button>
<el-button type="primary">主要按钮</el-button>
<el-button type="success">成功按钮</el-button>
<el-button type="info">信息按钮</el-button>
<el-button type="warning">警告按钮</el-button>
<el-button type="danger">危险按钮</el-button>
</el-row>
<!-- xyz-ui -->
<el-row>
<xyz-hello :msg="author"></xyz-hello>
<xyz-message :msg="msg"></xyz-message>
</el-row>
</section>
</div>
<main>
<!-- 引入组件库 -->
<script src="https://unpkg.com/vue@2.6.11/dist/vue.min.js"></script>
<script src="https://unpkg.com/element-ui@2.14.1/lib/index.js"></script>
<!-- <script src="./xyz.umd.js"></script> -->
<script src="./xyz.umd.min.js"></script>
<script>
console.log(`xyz =`, xyz);
console.log(`xyz.default[0] =`, xyz, xyz.default[0]);
console.log(`xyz.default[1] =`, xyz, xyz.default[1]);
var vm = new Vue({
el: '#vue_app',
// vm === data
data: {
msg: "vue ui lib ",
author: "xgqfrms",
},
component: {
// xyz 模块,引用方式
// Hello: xyz.default[0],
// Message: xyz.default[1],
},
});
setTimeout(() => {
let div = document.querySelector("#vue_app");
div.style.display = "block";
}, 0);
</script>
</body>
</html>

CJS


import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store"; import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css"; // 全局导入
import XYZ from "../lib/xyz.common";
import '../lib/xyz.css'; Vue.use(ElementUI);
Vue.use(XYZ); Vue.config.productionTip = false; new Vue({
router,
store,
render: h => h(App)
}).$mount("#app");

npm package


import Vue from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store"; import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css"; // 全局导入, ??? src/index 全局注册入口
import XYZ from "@xgqfrms/xyz/lib/xyz.common.js";
import '@xgqfrms/xyz/lib/lib/xyz.css'; Vue.use(ElementUI);
Vue.use(XYZ); Vue.config.productionTip = false; new Vue({
router,
store,
render: h => h(App)
}).$mount("#app");

src/index 全局注册入口

/* Automatically generated by './build/bin/build-entry.js' */

// 全局引入 ElementUI
import Vue from 'vue'; import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI); // 导入组件
import Hello from './hello';
import Message from './message'; import * as PACKAGE from '../package.json'; // 存储组件列表
const components = [
Hello,
Message,
]; // 定义 install 方法,接收 Vue 作为参数。
// 如果使用 use 注册插件,则所有的组件都将被注册
const install = function (Vue) {
// 判断是否安装
if (install.installed) return;
// 遍历注册全局组件
components.forEach(component => {
Vue.component(component.name, component);
});
// Vue.prototype 全局属性
// Vue.prototype.$message = DuiMessage;
} // 判断是否是直接引入文件
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
} export default {
version: PACKAGE.version,
// 导出的对象必须具有 install,才能被 Vue.use() 方法安装
install,
// 以下是具体的组件列表
...components,
};

脚本自动注册

build/bin/build-entry.js & components.json

// 全局导入, ??? src/index 全局注册入口 

-import XYZ from "@xgqfrms/xyz/lib/xyz.common.js";
+import XYZ from "@xgqfrms/xyz"; import '@xgqfrms/xyz/lib/lib/xyz.css';

提高易用性, 缩短导入路径名称


var Components = require('../../components.json'); var fs = require('fs');
var render = require('json-templater/string');
var uppercamelcase = require('uppercamelcase');
var path = require('path');
var endOfLine = require('os').EOL; var OUTPUT_PATH = path.join(__dirname, '../../src/index.js');
var IMPORT_TEMPLATE = 'import {{name}} from \'../packages/{{package}}/index.js\';';
var INSTALL_COMPONENT_TEMPLATE = ' {{name}}'; var MAIN_TEMPLATE = `
/* Automatically generated by './build/bin/build-entry.js' */ {{include}}
import locale from 'element-ui/src/locale';
import CollapseTransition from 'element-ui/src/transitions/collapse-transition'; const components = [
{{install}},
CollapseTransition
]; const install = function(Vue, opts = {}) {
locale.use(opts.locale);
locale.i18n(opts.i18n);
components.forEach(component => {
Vue.component(component.name, component);
});
Vue.use(InfiniteScroll);
Vue.use(Loading.directive);
Vue.prototype.$ELEMENT = {
size: opts.size || '',
zIndex: opts.zIndex || 2000
};
Vue.prototype.$loading = Loading.service;
Vue.prototype.$msgbox = MessageBox;
Vue.prototype.$alert = MessageBox.alert;
Vue.prototype.$confirm = MessageBox.confirm;
Vue.prototype.$prompt = MessageBox.prompt;
Vue.prototype.$notify = Notification;
Vue.prototype.$message = Message;
}; /* istanbul ignore if */
if (typeof window !== 'undefined' && window.Vue) {
install(window.Vue);
} export default {
version: '{{version}}',
locale: locale.use,
i18n: locale.i18n,
install,
CollapseTransition,
Loading,
{{list}}
};
`; delete Components.font; var ComponentNames = Object.keys(Components); var includeComponentTemplate = [];
var installTemplate = [];
var listTemplate = []; ComponentNames.forEach(name => {
var componentName = uppercamelcase(name); includeComponentTemplate.push(render(IMPORT_TEMPLATE, {
name: componentName,
package: name
})); if (['Loading', 'MessageBox', 'Notification', 'Message', 'InfiniteScroll'].indexOf(componentName) === -1) {
installTemplate.push(render(INSTALL_COMPONENT_TEMPLATE, {
name: componentName,
component: name
}));
} if (componentName !== 'Loading') listTemplate.push(` ${componentName}`);
}); var template = render(MAIN_TEMPLATE, {
include: includeComponentTemplate.join(endOfLine),
install: installTemplate.join(',' + endOfLine),
version: process.env.VERSION || require('../../package.json').version,
list: listTemplate.join(',' + endOfLine)
}); fs.writeFileSync(OUTPUT_PATH, template); console.log('[build entry] DONE:', OUTPUT_PATH);

refs



xgqfrms 2012-2020

www.cnblogs.com 发布文章使用:只允许注册用户才可以访问!


UMD 模块 vs CJS 模块的更多相关文章

  1. python常用模块(模块和包的解释,time模块,sys模块,random模块,os模块,json和pickle序列化模块)

    1.1模块 什么是模块: 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...

  2. Python模块之常用模块,反射以及正则表达式

    常用模块  1. OS模块 用于提供系统级别的操作,系统目录,文件,路径,环境变量等 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("di ...

  3. python基础知识8——模块1——自定义模块和第三方开源模块

    模块的认识 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需 ...

  4. Python引用模块和查找模块路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译 ...

  5. threading模块和queue模块实现程序并发功能和消息队列

    简介: 通过三个例子熟悉一下python threading模块和queue模块实现程序并发功能和消息队列. 说明:以下实验基于python2.6 基本概念 什么是进程? 拥有独立的地址空间,内存,数 ...

  6. VBA标准模块与类模块

    大家通过之前的介绍,已知道怎么将一个空模块插入VBA的工程中.从插入模块中可以看到,模块有有两种——标准模块与类模块.类模块是含有类定义的特殊模块,包括其属性和方法的定义.在后面会有介绍与说明. 随着 ...

  7. ansible定时任务模块和用户组模块使用

    接上篇,还是一些基础模块的使用,这里主要介绍的是系统模块的使用. 下面例子都进行过相关的实践,从而可以直接进行使用相关的命令. 3.用户模块的使用 用户模块主要用来管理用户账号和用户的属性(对远程主机 ...

  8. ansible服务模块和组模块使用

    本篇文章主要是介绍ansible服务模块和组模块的使用. 主要模块为ansible service module和ansible group moudle,下面的内容均是通过实践得到,可以直接运行相关 ...

  9. python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块

    正则表达式   语法:             mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ...

随机推荐

  1. uni-app开发经验分享五: 解决三端页面兼容问题的方法

    在做uni-app开发的过程中,我们最头疼可能不是开发的过程中的逻辑,而是最后要做的三端兼容测试和修改,在我开发的项目中,这一步都是最头疼和令人头秃的过程,这里总结一些个人开发遇到的问题,希望对大家有 ...

  2. Jmeter-插件扩展及性能监控插件的安装

    需要对http服务进行大数据量的传值测试:看看产品中的http服务,能支持传多少字符:目标值是希望能到10w+: 上次测试中,服务器总是内存满导致服务不响应,因此想增加对服务端的性能监控:查阅了smi ...

  3. Spring Security 实战干货:分布式对象SharedObject

    1. 前言 在上一篇我们对AuthenticationManager的初始化的细节进行了分析,其中里面有一段代码引起了不少同学的注意: ApplicationContext context = htt ...

  4. 我为什么不鼓吹 WireGuard

    原文链接:https://fuckcloudnative.io/posts/why-not-wireguard/ 最近有一款新型 VPN 工具备受瞩目,相信很多人已经听说过了,没错就是 WireGua ...

  5. 什么是STP

    简介 了解STP 配置STP 相关信息 简介 STP(Spanning Tree Protocol)是运行在交换机上的二层破环协议,环路会导致广播风暴.MAC地址表震荡等后果,STP的主要目的就是确保 ...

  6. top命令详解-性能分析

    top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,常用于服务端性能分析. top命令说明 [www.linuxidc.com@linuxidc-t-tomcat-1 ...

  7. Scheduling Multithreaded Computations by Work Stealing

    steal.pdf http://supertech.csail.mit.edu/papers/steal.pdf This paper studies the problem of eciently ...

  8. 2、剑指offer-字符串——替换空格

    **题目描述** **请实现一个函数,将一个字符串中的每个空格替换成"%20".例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. ...

  9. namedtuple

    Python的namedtuple使用详解_kongxx的专栏-CSDN博客_namedtuple https://blog.csdn.net/kongxx/article/details/51553 ...

  10. bzoj2654(loj20069)

    2654: tree Time Limit: 30 Sec  Memory Limit: 512 MB Description 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有ne ...