05.ElementUI源码学习:项目发布配置(github pages&npm package)
0x00.前言
书接上文。项目第一个组件已经封装好,说明文档也已编写好。下面需要将说明文档发布到外网上,以此来展示和推广项目,使用 Github Pages
功能实现。同时将组件发布之 npm
上,方便直接在项目中安装使用。
0x01.Github Pages发布
进入项目的 Github repo
,点击右上角的 Settings
选项。
点击左侧菜单的 Pages
选项,右侧显示项目 Github Pages
初始配置。source
配置项值为 None
说明此功能尚未开启。
点击 source
配置项下拉菜单,只有 master
(主分支/默认分支)、None
(关闭功能) 两个选项。
root 路径
选择 master
分支后,可以指定发布文件源的路径,默认项目根路径/(root)
,还可以指定根路径下的docs
文件夹;然后点击 Save
按钮保存,就会提示项目的发布地址 https://andurils.github.io/code-examples/ 。
打开网址若未成功解析,需要等待1-2分钟,再次刷新页面即可(当前根目录下只有readme.md文件,页面呈现内容为此文件)。
README.md
文件内容:
# 代码示例
## ElementUI 源码学习:从零开始搭建 Vue 组件库汇总
1. [0x01.项目初始化和 webpack 配置](https://juejin.cn/post/6950905030635421710)
2. [0x02.babel 配置](https://juejin.cn/post/6951215878928678948)
3. [03.ElementUI 源码学习:代码风格检查和格式化配置(ESlint & Prettier)](https://juejin.cn/post/6951808773354684447)
4. [04.ElementUI 源码学习:组件封装、说明文档的编写](https://juejin.cn/post/6953614014546968589)
docs 路径
作为一个开发分支根路径下放置发布文件,管理起来就比较混乱了,若不想维护新的分支用作静态网站发布,可以使用当前分支的 docs
路径,在配置里更改如下。
创建 build\webpack.docs.js
文件,复制 build\webpack.config.js
文件内容,修改 output/path
属性值由 dist
至 docs
。
module.exports = {
...
output: {
path: path.resolve(process.cwd(), 'docs'),
...
},
...
}
在package.json
文件中的 npm scripts
添加新的编译命令,将组件说明文档打包至 docs
路径下。
...
"scripts": {
...
"build:docs": "cross-env NODE_ENV=development webpack --config build/webpack.docs.js",
...
},
...
至此将 docs
下的文件上传至 Github 即可。由于本项目路径为/learning-element2/step03
,所以需要手动将 docs
内容复制至 Github 根目录下。Github Repo
最新目录结构如下:
├─docs
├─learning-element2
├─LICENSE
├─README.md
浏览器输入地址,打开页面效果如下:
gh-pages 分支
gh-pages
分支大家应该不陌生,按照早期的约定
静态网站发布需要创建该分支,才能使用 Github Pages
功能。接下将介绍如何快速的使用 gh-pages
进行项目发布。
先安装 gh-pages
插件, 在 npm scripts
添加部署命令。
// 安装插件
npm install -D gh-pages
// package.json 添加部署命令
"scripts": {
"deploy": "gh-pages -d dist"
}
然后编译打包项目 npm run build:dist
, 最后运行部署命令npm run deploy
进行项目文档发布,发布成功控制台显示 Published
。
"deploy": "gh-pages -d dist"
打开 Github Pages
配置,此时选项里出现了 gh-pages
,选择该分支即可。
gh-pages -d dist
等同于创建了一个gh-pages
分支并将dist
文件内容提交至该分支。
同理可以在Git Repo
创建任何分支现在,直接通过配置
可以指定具体的分支/路径(可以使用master
、gh-pages
之外的任何分支)。
0x02.npm 发布组件包
webpack配置
安装编译进度条插件
npm i -D progress-bar-webpack-plugin
创建 build\webpack.common.js
,采用 commonjs2
规范构建一个全量的包。
const path = require('path');
const ProgressBarPlugin = require('progress-bar-webpack-plugin');
const VueLoaderPlugin = require('vue-loader/lib/plugin');
const config = require('./config');
module.exports = {
mode: 'production',
entry: {
app: ['./src/index.js'], // Entry descriptor 传入一个对象 ./src/index.js
},
output: {
path: path.resolve(process.cwd(), './lib'), // 绝对路径
publicPath: '/dist/', // 相对于服务(server-relative)
filename: 'me-vue-ui.common.js',
chunkFilename: '[id].js',
library: {
type: 'commonjs2', //配置将库暴露的方式
export: 'default', // 指定哪一个导出应该被暴露为一个库
},
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: config.alias,
modules: ['node_modules'],
},
// externals: config.externals, //外部扩展
performance: {
// 控制 webpack 如何通知「资源(asset)和入口起点超过指定文件限制」
hints: false, // 不展示警告或错误提示
},
// 可以在统计输出里指定你想看到的信息
stats: {
children: false, // 是否添加关于子模块的信息
},
optimization: {
//告知 webpack 使用 TerserPlugin 或其它在 optimization.minimizer 定义的插件压缩 bundle
minimize: false,
},
module: {
rules: [
{
test: /\.(jsx?|babel|es6)$/,
include: process.cwd(),
exclude: config.jsexclude,
loader: 'babel-loader',
},
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
compilerOptions: {
preserveWhitespace: false,
},
},
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
{
test: /\.(svg|otf|ttf|woff2?|eot|gif|png|jpe?g)(\?\S*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: path.posix.join('static', '[name].[hash:7].[ext]'),
},
},
],
},
plugins: [new ProgressBarPlugin(), new VueLoaderPlugin()],
};
在 npm scripts
添加组件打包命令,生成至 lib
目录下。
...
"scripts": {
...
"dist": "webpack --config build/webpack.common.js ",
...
},
...
输入命令 npm run dist
生成组件打包文件 lib\me-vue-ui.common.js
。
将 examples\main.js
文件中的组件引用 由 '../src/index'
替换成 '../lib/me-vue-ui.common'
。
// examples\main.js
// import MeUI from '../src/index';
import MeUI from '../lib/me-vue-ui.common';
输入命令 npm run dev
运行项目,项目正常启动无错误,则组件打包成功。
npm 配置
配置 package.json
文件中属性值用于npm 发布。
- name: 包名,该名字是唯一的。需要去npm registry查看名字是否已被使用。
- version: 包版本号,版本号规则参考《语义化版本 2.0.0》。每次发布至 npm 需要修改版本号,不能和历史版本号相同。
- description: 包的描述,描述这个包的主要功能以及用途。
- main: 入口文件,该字段需指向项目编译后的包文件。
- keyword:关键字,数组、字符串。
- author:包的作者。
- private:是否私有,需要修改为 false 才能发布到 npm
- license: 开源协议。
- repository:包的Git Repo信息,包括type和URL。
- homepage:项目官网的url。
更新 package.json
文件内容。
{
"name": "me-vue-ui",
"version": "0.1.2",
"description": "A Vue.js 2.X UI Toolkit for Web",
"main": "lib/me-vue-ui.common.js",
"keyword": [
"me-vue",
"vuejs",
"components",
"ui-kit"
],
"repository": {
"type": "git",
"url": "git+https://github.com/andurils/code-examples.git"
},
"author": "anduril",
"license": "MIT",
"homepage": "https://andurils.github.io/code-examples"
}
添加 .npmignore
文件,设置忽略发布文件。发布到 npm 中文件,只保留有的 lib 目录、package.json、README.md。
# 忽略目录
build/
dist/
examples/
packages/
public/
src/
test/
docs/
# 忽略指定文件
.eslintignore
.prettierignore
.eslintrc.js
.prettierrc.js
babel.config.json
更新README.md
内容,会作为npm包的 Readme
Tab选项内容发布。
npm 发布
首先 npmjs.com 上注册一个账号,确保 npm 使用的是原镜像。
npm config set registry http://registry.npmjs.org
然后在命令行窗口跳转至项目路径下, 运行 npm login
登录授权。
执行 npm publish
命令发布组件包。
发布成功后,进入组件包信息页面 https://www.npmjs.com/package/me-vue-ui, 可以看到上面的项目配置信息 。
npm install 测试
使用vue cli 创建一个项目,引用刚发布的组件包。全局注册组件,页面引入组件,刷新页面即可看到发布的组件。
npm install me-vue-ui -S
操作效果如下:
0x03.总结
从项目初始化到组件编写发布用了5篇文章的篇幅,耐心读完,你会发现很简单,没有想象中那么神秘高不可攀。由于前端技术的快速发展,版本的更迭,很多插件的配置让人头大。网络上的方案要不是玄学能用就行,为什么不知道;要么就是使用方法已经废弃。所以文章花了不少篇幅进行了知识梳理,也算是自我的一种回顾。也希望你有所收获!
接下来将对 element-ui
架构更进一步的拆解学习,一步步引入(copy)其工程化、组件、文档。
0x04.示例代码
0x05.参考
05.ElementUI源码学习:项目发布配置(github pages&npm package)的更多相关文章
- Asp.NetCore源码学习[2-1]:配置[Configuration]
Asp.NetCore源码学习[2-1]:配置[Configuration] 在Asp. NetCore中,配置系统支持不同的配置源(文件.环境变量等),虽然有多种的配置源,但是最终提供给系统使用的只 ...
- Asp.NetCore源码学习[1-2]:配置[Option]
Asp.NetCore源码学习[1-2]:配置[Option] 在上一篇文章中,我们知道了可以通过IConfiguration访问到注入的ConfigurationRoot,但是这样只能通过索引器IC ...
- Vue2.0源码学习(4) - 合并配置
合并配置 通过之前的源码学习,我们已经了解到了new Vue主要有两种场景,第一种就是在外部主动调用new Vue创建一个实例,第二个就是代码内部创建子组件的时候自行创建一个new Vue实例.但是无 ...
- 02.ElementUI源码学习:babel配置
书接上文,接下来项目将引入babel支持ES6+语法兼容. Babel 是一个工具链,主要用于将 ECMAScript 2015+ 版本的代码转换为向后兼容的 JavaScript 语法,以便能够运行 ...
- 04.ElementUI源码学习:组件封装、说明文档的编写发布
0x00.前言 书接上文.项目经过一系列的配置,开发脚手架已经搭建完毕.接下来开始封装自定义组件.并基于 markdown 文件生成文档和演示案例. 后续文章代码会根据篇幅,不影响理解的情况下进行部分 ...
- Dubbo源码学习--服务发布(ServiceBean、ServiceConfig)
前面讲过Dubbo SPI拓展机制,通过ExtensionLoader实现可插拔加载拓展,本节将接着分析Dubbo的服务发布过程. 以源码中dubbo-demo模块作为切入口一步步走进Dubbo源码. ...
- Dubbo源码学习--服务发布(ProxyFactory、Invoker)
上文分析了Dubbo服务发布的整体流程,但服务代理生成的具体细节介绍得还不是很详细.下面将会接着上文继续分析.上文介绍了服务代理生成的切入点,如下: Invoker<?> invoker ...
- Dubbo源码学习--服务发布(DubboProtocol、Exporter)
在Dubbo服务发布的整体流程一文中,只是分析了服务发布的整体流程,具体的细节还没有进一步分析.本节将继续分析服务暴露的过程.在ServiceConfig中通过一句话即可暴露服务,如下: Export ...
- 03.ElementUI源码学习:代码风格检查和格式化配置(ESlint & Prettier)
书接上文.在团队协作中,为避免低级Bug.以及团队协作时不同代码风格对彼此造成的困扰与影响,会预先制定编码规范.使用 Lint工具和代码风格检测工具,则可以辅助编码规范执行,格式化代码,使样式与规则保 ...
随机推荐
- SpringBoot2.2.5整合ElasticSearch7.9.2
1:前言 为什么是SpringBoot2.2.5,不是其他的SpringBoot版本,原因有两个: 1:SpringBoot2.2.0以上才能支持ElasticSearch7.x版本. 2:Sprin ...
- SpringBoot(五):SpringBoot使用拦截器
1.按照SpringMVC的方式编写一个拦截器: 2.配置一个类 implements WebMvcConfigurer 接口 为该类添加注解@Configuration (等价于一个sprin ...
- 后端程序员之路 41、BlockingQueue
BlockingQueue,阻塞队列,常用于实现生产者和消费者模型特点:1.队列为空时,取操作会等到队列有数据2.队列满时,存操作会等到队列可用 基于C++11的阻塞队列简单实现 - Cynric 的 ...
- Latency 和 Delay 区别
时延:Latency 指的是一个报文进入一台设备以致这台设备所经历的时间.实际上考验的是报文在这台设备上消耗的时间.时间越短,这台设备的性能越高. 延时:Delay 是指一个操作和另个一个操作之间 ...
- 关于KMP算法中,获取next数组算法的理解
参考:KMP入门级别算法详解--终于解决了(next数组详解) https://blog.csdn.net/lee18254290736/article/details/77278769 在这里讨论的 ...
- `vi`——终端中的编辑器
`vi`--终端中的编辑器 目标* `vi` 简介* 打开和新建文件* 三种工作模式* 常用命令* 分屏命令* 常用命令速查图 01. `vi` 简介 1.1 学习 `vi` 的目的 * 在工作中,要 ...
- Intellij IDEA实用插件Lombok
使用@Data注解后 可以不用给属性添加get.set方法也可以使用get.set方法,但是必须添加lombok Plugin插件 1 打开设置Setting,选中Plugins,搜索并安装Lombo ...
- 关于python浮点数精度问题计算误差的原因分析
在python中使用浮点数运算可能会出现如下问题 a = 0.1+0.2print(a) 输出的结果是 0.30000000000000004 原因如下: 出现上面的情况,主要还是因浮点数在计算机中实 ...
- Django之cookie 与session组件
一.会话跟踪技术 1.1 什么是会话跟踪 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而 ...
- PTA 单链表分段逆转
6-9 单链表分段逆转 (25 分) 给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1 ...