vite,构建生产版本——库模式 https://cn.vitejs.dev/guide/build.html#library-mode
详细设置 https://cn.vitejs.dev/config/#build-lib
vue-cli 自带的是 webpack 的打包方式,打出的包体积有点大,而 vite 自带的是 rollup 的打包方式,这种方式打包的体积就非常小,官网也有一些使用说明,所以学会之后还是比较很方便的。
vite 的库项目可以分为两类:(我自己分的)
下面分别介绍一下编写和打包方式,其实大同小异。
使用 vite 建立项目,这里举一个简单的例子:
// main.js
const toTypeString = (val) => {
returnObject.prototype.toString.call(val)
}
const typeName = (val) => {
returnObject.prototype.toString.call(val).replace(/^\[object (\S+)\]$/,'$1').toLowerCase()
}
const hasOwnProperty = Object.prototype.hasOwnProperty
const hasOwn = (val, key) => hasOwnProperty.call(val, key)
const isFunction = (val) => toTypeString(val) === '[object Function]'
const isAsync = (val) => toTypeString(val) === '[object AsyncFunction]'
const isObject = (val) => val !== null && typeof val === 'object'
const isArray = Array.isArray
const isString = (val) =>typeof val === 'string'
const isNumber = (val) =>typeof val === 'number'
const isBigInt = (val) =>typeof val === 'bigint'
const isBoolean = (val) =>typeof val === 'boolean'
const isRegExp = (val) => toTypeString(val) === '[object RegExp]'
const isDate = (val) => val instanceofDate
const isMap = (val) => toTypeString(val) === '[object Map]'
const isSet = (val) => toTypeString(val) === '[object Set]'
const isPromise = (val) => toTypeString(val) === '[object Promise]'
const isSymbol = (val) =>typeof val === 'symbol'
const isNullOrUndefined = (val) => {
if (val === null) returntrue
if (typeof val === 'undefined') returntrue
returnfalse
}
function log(){
if (window.__showlog) console.log(...arguments)
}
const logTime = (msg, auto = true) => {
const start = () => {
if (window.__showlog) console.time(msg)
}
const end = () => {
if (window.__showlog) console.timeEnd(msg)
}
if (auto) start() // 自动开始计时
return { start, end }
}
export {
log, // 打印调试信息
logTime, // 计时
toTypeString, // Object.prototype.toString.call(val)
typeName, // 获取可以识别的名称
hasOwnProperty,
hasOwn,
isFunction, // 验证普通函数
isAsync, // 验证 async 的函数
isPromise, // 验证 Promise
isObject, // 验证 Object
isArray, // 验证数组
isString, // 验证字符串
isNumber, // 验证 number
isBigInt, // 验证 BigInt
isBoolean, // 验证 布尔
isRegExp, // 验证正则类型
isDate, // 验证日期
isMap, // 验证 map
isSet, // 验证 set
isSymbol, // 验证 Symbol
isNullOrUndefined // null 或者 undefined 返回 true
}
代码比较简单,仅仅只是演示。
想要打包的话,只能有一个出口文件,所以内部的代码结构要设置好。
纯js的好办了,export 输出就好,那么带模板的怎么办呢?其实也是一样的。
用 vite 建立一个项目,建立一个测试文件:
// t-text.vue
<template>
<el-input
v-model="value"
:id="'c' + columnId"
:name="'c' + columnId"
:size="size"
:clearable="clearable"
:validate-event="validate_event"
:show-word-limit="show_word_limit"
@blur="run"
@change="run"
@clear="run"
@input="myinput"
@keydown="clear"
>
el-input>
import { defineComponent } from'vue'
// 按需索取的方式引入UI库(非必须)
import { ElInput } from'element-plus'
// 引入组件需要的属性、表单子控件的管理类
import { itemProps, itemController } from'nf-ui-controller'
exportdefault defineComponent({
name: 'el-form-item-text',
props: {
'el-input': ElInput,
modelValue: [String, Number],
...itemProps // 基础属性
},
emits: ['update:modelValue'],
setup (props, context) {
const {
value,
run,
clear,
myinput
} = itemController(props, context.emit)
return {
value,
run,
clear,
myinput
}
}
})
这是基于UI库做的二次封装的库,使用了两个第三方插件:
然后我们设置一个入口文件 main.js
import nfText from'./t-text.vue'
export {
nfText
}
如果有很多组件的话,就要考虑好结构,这里只是举个例子。
代码写好之后,需要设置一下 vite.config.js
import { defineConfig } from'vite'
import vue from'@vitejs/plugin-vue'
import { resolve } from'path'// 主要用于alias文件路径别名
exportdefault defineConfig({
plugins: [vue()],
// 打包配置
build: {
lib: {
entry: resolve(__dirname, 'lib/main.js'), // 设置入口文件
name: 'nf-tool', // 起个名字,安装、引入用
fileName: (format) =>`nf-tool.${format}.js`// 打包后的文件名
},
sourcemap: true, // 输出.map文件
rollupOptions: {
// 确保外部化处理那些你不想打包进库的依赖
external: ['vue'],
output: {
// 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
globals: {
vue: 'Vue'
}
}
}
}
})
vite 会按照这里的设置进行打包,打包分为两种模式:
如果项目使用了第三方的插件,那么需要在 external 里面做设置:
import { defineConfig } from'vite'
import vue from'@vitejs/plugin-vue'
import { resolve } from'path'// 主要用于alias文件路径别名
// https://vitejs.dev/config/
exportdefault defineConfig({
plugins: [vue()],
// 打包配置
build: {
lib: {
entry: resolve(__dirname, 'lib/main.js'),
name: 'nf-ui-element-plus',
fileName: (format) =>`nf-ui-element-plus.${format}.js`
},
sourcemap: true,
rollupOptions: {
// 确保外部化处理那些你不想打包进库的依赖
external: ['vue','nf-ui-controller','element-plus'], // 注意看这里
output: {
// 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
globals: {
vue: 'Vue',
'nf-ui-controller': 'nfUIController',
'element-plus': 'elementPlus'
}
}
}
}
})
设置之后,第三方插件的代码,会以 import 的方式被引用。 如果不做设置的话,就会把第三方插件里面使用到的代码,拿出来作为项目内部代码一起被打包,这样包的体积就变大了。
设置 package.json 主要是发布的时候做资源包的说明,需要按照 npm 的要求设置属性:
{
"name": "nf-tool",
"version": "0.0.4",
"description": "JavaScript 的小工具,验证 JavaScript 的数据类型,输出调试信息等。",
"keyword": "JavaScript typeof log",
"files": ["dist"],
"main": "./dist/nf-tool.umd.js",
"module": "./dist/nf-tool.es.js",
"exports": {
".": {
"import": "./dist/nf-tool.es.js",
"require": "./dist/nf-tool.umd.js"
}
},
"private": false,
"license": "MIT",
"auther": "jin yang (jyk). Email: jyk0013@163.com",
"scripts": {
"dev": "vite",
"build": "vite build",
"serve": "vite preview"
},
"dependencies": {
"@element-plus/icons": "^0.0.11",
"element-plus": "^1.2.0-beta.3",
"nf-tool": "^0.0.6",
"vue": "^3.2.16"
},
"devDependencies": {
"@vitejs/plugin-vue": "^1.9.3",
"vite": "^2.6.4"
}
}
如果在安装资源包的时候,不想自动安装第三方插件的话,需要去掉 dependencies 和 devDependencies,否则会自动安装里面涉及到的第三方插件。
设置好之后我们可以用 yarn build
进行打包。
打包后的文件是这种风格:
*.es.js的效果
*.umd.js 的效果
简单介绍一下步骤:
npm login
登录;npm publish
发布;篇幅有限,细节就不介绍了。
我喜欢使用 yarn 安装资源包,因为速度更快一些。
yarn add nf-tool
package.json 里面设置的名称就是安装用的名称,所以要起个好的名称,另外不能和现有的名称重复。
为啥会有这样的需求? 库项目在编写的时候,需要一个开发环境,一边写代码,一边运行看效果。 写好之后需要按库项目的方式打包。 然后是不是需要一个测试环境,或者演示环境?
如果再建立一个项目写测试和演示,那么就有点麻烦了,如果可以在一个项目搞定就方便多了。 这个时候就需要设置不同的 vite.config.js 。
之前使用注释的方式,改来改去的比较麻烦。现在发现 vite 提供了“模式”的方式,允许我们在 vite.config.js 里面做不同的设置。
按照官网的说明,我们可以建立多个 .env.* 文件,来存放不同的“模式”:
.env : 开发环境(默认)
VITE_BASEURL=./
.env.project : 测试、演示环境
VITE_BASEURL=nf-rollup-tool
.env.lib : 库打包
VITE_BASEURL=lib
模式设置好之后我们来修改 vite.config.js
在 vite.config.js 里面,首先定义不同的 defineConfig 备用,然后使用 loadEnv 读取模式值,根据模式返回对应的 defineConfig。
import { defineConfig, loadEnv } from'vite'
import vue from'@vitejs/plugin-vue'
import { resolve } from'path'// 主要用于alias文件路径别名
const pathResolve = (dir) => resolve(__dirname, '.', dir)
// 发布库的设置
const lib = defineConfig({
plugins: [vue()],
// 打包配置
build: {
lib: {
entry: resolve(__dirname, 'lib/main.js'),
name: 'nf-tool',
fileName: (format) =>`nf-tool.${format}.js`
},
sourcemap: true,
rollupOptions: {
// 确保外部化处理那些你不想打包进库的依赖
external: ['vue'],
output: {
// 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
globals: {
vue: 'Vue'
}
}
}
}
})
// 开发模式、生产模式
const project = (url) => {
return defineConfig({
plugins: [vue()],
devtools: true,
resolve: {
alias: {
'/@': resolve(__dirname, '.', 'src'),
'/nf-tool': pathResolve('lib/main.js') //
}
},
base: url,
// 打包配置
build: {
sourcemap: true,
outDir: 'distp', // 指定输出路径,要和库的包区分开
assetsDir: 'static/img/', // 指定生成静态资源的存放路径
rollupOptions: {
output: {
chunkFileNames: 'static/js1/[name]-[hash].js',
entryFileNames: 'static/js2/[name]-[hash].js',
assetFileNames: 'static/[ext]/[name]-[hash].[ext]'
},
brotliSize: false, // 不统计
target: 'esnext',
minify: 'esbuild'// 混淆器,terser构建后文件体积更小
}
}
})
}
// 用 loadEnv 读取模式,然后返回对应的 defineConfig
exportdefault ({ mode }) => {
const url = loadEnv(mode, process.cwd()).VITE_BASEURL
if (url === 'lib') {
// 打包库文件
return lib
} else {
// 开发模式、生产模式
return project(url)
}
}
注意:需要设置不同的输出的文件夹,否则会互相覆盖。
设置执行的命令,后面加上需要的模式。
"scripts": {
"dev": "vite",
"build": "vite build --mode project",
"lib": "vite build --mode lib",
"serve": "vite preview"
}
这样就可以把不同的环境完全分开了,如果有其他的需求,还可以增加更多的模式。
yarn dev // 开发环境
yarn build // 打包发布到网站,演示
yarn lib // 打包库项目,做成资源包
这样各司其职,互不干扰,也不用各种写注释了。
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/Ce69X6_gs4uxlhZfHH7Smw
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。