svg画个环形图【另附项目案例发布到npm上的实践】

最近的H5项目中需要用到进度环形图的展示,对比了业界主流的UI库后,发现不是特别符合我的需求,最后决定用canvas或svg自己实现一波!

附上UI设计图

01.png

Canvas实现

03.png

Svg实现

02.png

-Github地址 :circle-progress

-npm地址 :v-circle-progress

通过实践,最终决定采用svg,canvas做出来的视图效果不是很好(进度条模糊)

html

<svg
    :width="width"
    :height="width"
    :viewbox="`0 0 ${width} ${width}`"
    class="svgWrap"
>
    <circle
        :cx="width * 0.5"
        :cy="width * 0.5"
        :r="width * 0.4"
        :stroke-width="width * 0.05"
        stroke-linecap="round"
        :stroke="backColor"
        fill="none"
        stroke-opacity="0.2"
        :transform="`matrix(0,-1,1,0,0,${width})`"
        :stroke-dasharray="
        `${0.75 * (width * 0.4 * Math.PI * 2)} ${0.25 *
        (width * 0.4 * Math.PI * 2)}`"
    >
    </circle>
    <circle
        ref="progress"
        :cx="width * 0.5"
        :cy="width * 0.5"
        :r="width * 0.4"
        :stroke-width="width * 0.05"
        stroke-linecap="round"
        :stroke="lineColor"
        fill="none"
        :transform="`matrix(0,-1,1,0,0,${width})`"
        :stroke-dasharray="dasharray"
        >
    </circle>
</svg>
复制代码

js

data() {
    return {
       dasharray: `0 ${this.width * 0.4 * Math.PI * 2}`,
    }
},
mounted() {
    this.draw(this.rate)
},
methods: {
    draw(rate) {
        this.$nextTick(() => {
            let per = 0.75 * rate
            let circle = this.$refs['progress']
            let perimeter = circle.getTotalLength() //圆环的周长
            this.dasharray = perimeter * per + ' ' + perimeter * (1 - per)
        })
    }
}
复制代码

将组件包发布到npm

步骤如下

一:项目初始化及配置

1、新建一个空白文件夹

mkdir circleProgress // 这里文件夹名为 circleProgress
复制代码

2、初始化项目:
进入到 circleProgress 文件夹,初始化项目。会提示你填一些项目相关的信息,跟着提示操作便是了。没啥说的。关于包的名字可以先去npmjs.com搜一下有没有重名的,不要和npm库现有的其它npm包重名了,不然一会儿发npm包的时候会失败!!

npm init 
复制代码

3、package.json 依赖引进:
由于使用了es6和webpack,所以在devDependencies字段中,应该至少加入以下依赖

"devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.2",
    "babel-plugin-transform-object-rest-spread": "^6.26.0",
    "babel-plugin-transform-runtime": "^6.23.0",
    "babel-polyfill": "^6.26.0",
    "babel-preset-es2015": "^6.24.1",
    "css-loader": "^0.28.7",
    "es6-promise": "^4.1.1",
    "less": "^2.7.3",
    "less-loader": "^4.0.5",
    "style-loader": "^0.19.0",
    "url-loader": "^0.6.2",
    "vue": "^2.6.14",
    "vue-hot-reload-api": "^2.2.4",
    "vue-html-loader": "^1.2.4",
    "vue-loader": "^13.5.0",
    "vue-router": "^3.0.1",
    "vue-style-loader": "^3.0.3",
    "vue-template-compiler": "^2.6.14",
    "vuex": "^3.0.1",
    "webpack": "^3.9.1",
    "webpack-dev-server": "^2.9.5"
}
复制代码

4、下载依赖包

npm install
复制代码

5、新建 src 和 dist 文件夹:
src是开发目录,在里面写我们的业务代码,dist目录是等会儿通过webPack打包后存放js文件的地方

6、加入webpack打包配置,并把src中的内容打包进dist目录中:
根目录下新增webpack.config.js文件

const path = require('path')
const webpack = require('webpack')
const uglify = require('uglifyjs-webpack-plugin')

module.exports = {
    devtool: 'source-map',
    entry: './src/index.js', //入口文件,就是上步骤的src目录下的index.js文件,
    output: {
            path: path.resolve(__dirname, './dist'), //输出路径,就是上步骤中新建的dist目录,
            publicPath: '/dist/',
            filename: 'zwtCircleProgress.min.js', // 输出文件,对应package.json中的main字段
            libraryTarget: 'umd',
            umdNamedDefine: true,
    },
    module: {
        rules: [
            {
                    test: /\.vue$/,
                    loader: 'vue-loader',
            },
            {
                    test: /\.less$/,
                    use: [
                            { loader: 'style-loader' },
                            { loader: 'css-loader' },
                            { loader: 'less-loader' },
                    ],
            },
            {
                    test: /\.js$/,
                    exclude:
                                /node_modules|vue\/dist|vue-router\/|vue-loader\/|vue-hot-reload-api\//,
                    loader: 'babel-loader',
            },
            {
                    test: /\.(png|jpg|gif|ttf|svg|woff|eot)$/,
                    loader: 'url-loader',
                    query: {
                            limit: 30000,
                            name: '[name].[ext]?[hash]',
                    },
            },
        ],
    },
    plugins: [
        new webpack.DefinePlugin({
            'process.env': {
                    NODE_ENV: JSON.stringify('production'),
            },
        }),
    ]
 }

复制代码

7、打包【需要修改package.json中的main字段指向的主文件信息】

npm run build 
复制代码

8、修改main字段指向的主文件信息

... 
"main": "dist/zwtCircleProgress.min.js" // 换成你对应的主文件名称
复制代码

9、新建.npmignore文件,用于忽略发布到npm上的文件,规则同.gitignore一样

.*  
*.yml
build
/ node_modules
/ src
/ test
复制代码

二:npm操作

1、注册npm账号(一定要进行邮箱验证,否则等会儿包无法发上去,会报403权限问题)

2、进入到根目录下,运行npm login,输入你的用户名,密码和邮箱,若登录成功,会显示:

  Logged in as 你的名字 on https://registry.npmjs.org/.
复制代码

3、运行npm publish 发布到npm官网上

注意点1:要验证邮箱

注意点2:包名不能与npm库的已有包名相同【可以先查询一波】


关于npm的版本控制
在我们的package.json里面有一个version字段。我们可以通过它在项目不断构建的过程中调整版本

npm有一套自己的版本控制标准——Semantic versioning(语义化版本)

具体体现为: 对于”version”:”x.y.z”

01.修复bug,小改动,增加z

02.增加了新特性,但仍能向后兼容,增加y

03.有很大的改动,无法向后兼容,增加x

例如:我原本的项目是1.0.0版本的话

若是1中情况,变为1.0.1

若是2中情况,变为1.1.0

若是3中情况,变为2.0.0
复制代码

通过npm version <update_type>自动改变版本

update_type 参数有:
    patch, 
    minor, 
    major
分别表示补丁,小改,大改
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享