在Vue中,如何用lib模式发布自己的库代码
使用lib模式打包在vue-cli官网中有指出如何使用lib模式构建代码。当你运行vue-cli-service build时,你可以通过--target选项指定不同的构建目标。它允许你将相同的源代码根据不同的用例生成不同的构建。lib模式默认是不含有Vue的,若原代码中有vue,则会将原代码中的vue删除。注意对 Vue 的依赖在库模式中,Vue 是外置的。这意味着包中不会有 Vue,即便你在代
使用lib模式打包
在vue-cli官网中有指出如何使用lib模式构建代码。
当你运行 vue-cli-service build 时,你可以通过 --target 选项指定不同的构建目标。它允许你将相同的源代码根据不同的用例生成不同的构建。
lib模式默认是不含有Vue的,若原代码中有vue,则会将原代码中的vue删除。
注意对 Vue 的依赖
在库模式中,Vue 是外置的。这意味着包中不会有 Vue,即便你在代码中导入了 Vue。如果这个库会通过一个打包器使用,它将尝试通过打包器以依赖的方式加载 Vue;否则就会回退到一个全局的
Vue变量。要避免此行为,可以在
build命令中添加--inline-vue标志。vue-cli-service build --target lib --inline-vue
核心命令——将一个单独的入口构建为一个库:
vue-cli-service build --target lib --name myLib [entry] 这个入口可以是一个 .js 或一个 .vue 文件。如果没有指定入口,则会使用 src/App.vue。我们只需要在指定的入口文件中export我们需要的模块即可。
例如:
export {default as Button} from './button/button'
export {default as Cascader} from './cascader/cascader'
export {default as CascaderItems} from './cascader/cascader-items'
export {default as GridRow} from './grid/row'
export {default as GridCol} from './grid/col'
export {default as Input} from './input/input'构建一个库会输出:
- dist/myLib.common.js:一个给打包器用的 CommonJS 包 (不幸的是,webpack 目前还并没有支持 ES modules 输出格式的包)
- dist/myLib.umd.js:一个直接给浏览器或 AMD loader 使用的 UMD 包
- dist/myLib.umd.min.js:压缩后的 UMD 构建版本
- dist/myLib.css:提取出来的 CSS 文件 (可以通过在- vue.config.js中设置- css: { extract: false }强制内联)
将打包命令写入package.json中:
"description": "一个基于vue的ui组件库",
  "main": "dist/Tione.umd.min.js",  //打包后的包入口文件
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build --target lib --name Tione src/index.js",
  },打包出来的文件:
 
JS中的模块是什么
1、立即执行函数
在js早期的时候,是没有模块的概念的,仅仅是一个个简单的脚本。js程序员们通过立即执行函数封装成一个个独立的局部作用域,这就是模块早期的雏形。
2、CommonJS
直到node.js的诞生,js可以写后台了,后台代码量大功能多,不得不需要封装成模块以便调用。而这个JS模块化标准称之为——CommonJS。
CommonJS是同步的,同步的在node.js环境服务器中使用同步加载模块是没有问题的,但在浏览器中js是在html中异步加载资源的,CommonJS在浏览器中就不太使用了。
代码风格:
module;
module.exports=new hello();
3、AMD
requirejs模块化标准,我们称之为AMD。它是异步代码,适用于在浏览器中进行加载。
代码风格:
require(['vue'],function (Vue) {  //参数vue就是vue.js对外暴露的对象
    // 内容
    new Vue()
});4、import/export
ES6的新语法import/export,ES6 模块的运行机制与 CommonJS 不一样。JS 引擎对脚本静态分析的时候,遇到模块加载命令import,就会生成一个只读引用。等到脚本真正执行时,再根据这个只读引用,到被加载的那个模块里面去取值。换句话说,ES6 的import有点像 Unix 系统的“符号连接”,原始值变了,import加载的值也会跟着变。因此,ES6 模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。
ES6在语言规格的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的CommonJS和AMD规范,成为浏览器和服务器通用的模块解决方案。
5、UMD
umd是AMD和CommonJS的结合,即可异步也可同步。
开发人员又想出另一个更通用的模式UMD (Universal Module Definition)。希望解决跨平台的解决方案。UMD先判断是否支持Node.js的模块(exports)是否存在,存在则使用Node.js模块模式。再判断是否支持AMD(define是否存在),存在则使用AMD方式加载模块。
webpack的环境判断
我们可以点开打包后的dist文件中以umd.js结尾的文件,看看webpack是如何进行环境判断的。
(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object') //node.js
		module.exports = factory(require("vue"));
	else if(typeof define === 'function' && define.amd) //AMD webpack 浏览器环境
		define([], factory);
	else if(typeof exports === 'object') //???
		exports["Tione"] = factory(require("vue"));
	else //root => window global 等等其它环境
		root["Tione"] = factory(root["Vue"]);  
})
更多推荐
 
 



所有评论(0)