在此之前,你需要去npm官网注册一个属于自己的账号,记住自己的账户名以及密码、邮箱,后面会用的到。
vue init webpack-simple marquee
这里会用到
vue init
命令,如果你的cli
版本是3或者以上,那么在此之前你需要安装vue/cli-init
npm install -g @vue/cli-init
vue init
的运行效果将会跟[email protected]
相同
marquee/
├── index.html
├── package.json
├── README.md
├── .babelrc
├── .editorconfig
├── .gitignore
├── src
│ ├── App.vue
│ ├── assets
│ │ └── logo.png
│ └── main.js
└── webpack.config.js
src文件夹
下创建一个名叫marquee的文件夹
,在文件夹里面创建marquee.vue
和index.js
marquee/
├── index.html
├── package.json
├── README.md
├── .babelrc
├── .editorconfig
├── .gitignore
├── src
│ ├── App.vue
│ ├── marquee
│ │ └── marquee.vue
│ │ └── index.js
│ ├── assets
│ │ └── logo.png
│ └── main.js
└── webpack.config.js
marquee.vue
封装Vue插件了<template>
<div class="marquee-wrap">
<div class="scroll">
<p class="marquee">{{text}}p>
<p class="copy">p>
div>
<p class="getWidth">{{text}}p>
div>
template>
<script>
export default {
name: 'marquee',
props: ['val'],
data () {
return {
timer: null,
text: ''
}
},
created () {
let timer = setTimeout(() => {
this.move()
clearTimeout(timer)
}, 1000)
},
// 把父组件传入的arr转化成字符串
mounted () {
for (let item of this.val) {
this.text += ' ' + item
}
},
methods: {
move () {
let maxWidth = document.querySelector('.marquee-wrap').clientWidth
// 获取文字text 的计算后宽度 (由于overflow的存在,直接获取不到,需要独立的node计算)
let width = document.querySelector('.getWidth').scrollWidth
// 如果文本内容的宽度小于页面宽度,则表示文字小于等于一行,则不需要滚动
if (width <= maxWidth) return
let scroll = document.querySelector('.scroll')
let copy = document.querySelector('.copy')
copy.innerText = this.text // 文字副本填充
let distance = 0 // 位移距离
// 设置位移
this.timer = setInterval(() => {
distance -= 1
// 如果位移超过文字宽度,则回到起点
if (-distance >= width) {
distance = 16 // 距离必须与marquee的margin宽度相同
}
scroll.style.transform = 'translateX(' + distance + 'px)'
}, 20)
}
},
beforeDestroy () {
// 清除计时器
clearInterval(this.timer)
}
}
script>
<style scoped>
.marquee-wrap {
width: 100%;
overflow: hidden;
position: relative;
}
.marquee{
margin-right: 16px;
}
p {
word-break:keep-all;
white-space: nowrap;
font-size: 16px;
font-family: "微软雅黑 Light";
}
.scroll {
display: flex;
}
.getWidth {
word-break:keep-all;
white-space:nowrap;
position: absolute;
opacity: 0;
top: 0;
}
style>
<template>
<div id="app">
<Marquee :val="msg">Marquee>
div>
template>
<script>
import Marquee from '../src/marquee/marquee.vue';
export default {
name: 'app',
data () {
return {
msg: '啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊'
}
},
components:{
Marquee
}
}
script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
h1, h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
style>
npm install
npm run dev
marquee文件夹
下的index.js
marquee/
├── index.html
├── package.json
├── README.md
├── .babelrc
├── .editorconfig
├── .gitignore
├── src
│ ├── App.vue
│ ├── marquee
│ │ └── marquee.vue
│ │ └── index.js
│ ├── assets
│ │ └── logo.png
│ └── main.js
└── webpack.config.js
index.js
// index.js
// 引入组件
import marquee from './marquee';
// 组件需要添加name属性,代表注册的组件名称,也可以修改成其他的
marquee.install = Vue => Vue.component(marquee.name, marquee); //注册组件
export default marquee;
webpack.config.js
const NODE_ENV = process.env.NODE_ENV;
module.exports = {
entry: NODE_ENV == 'development' ? './src/main.js' : './src/marquee/index.js',
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'marquee.js', //输出文件名
library: 'marquee', // 指定的就是你使用require时的模块名
libraryTarget: 'umd', // 指定输出格式, UMD 同时支持两种执行环境:node环境、浏览器环境。
umdNamedDefine: true // 会对 UMD 的构建过程中的 AMD 模块进行命名。否则就使用匿名的 define
},
}
npm run build
如果成功的话,根目录下会出现dist文件夹
,里面分别是marquee.js
和marquee.js.map
marquee/
├── dist
│ ├── marquee.js
│ ├── marquee.js.map
├── index.html
├── package.json
├── README.md
├── .babelrc
├── .editorconfig
├── .gitignore
├── src
│ ├── App.vue
│ ├── marquee
│ │ └── marquee.vue
│ │ └── index.js
│ ├── assets
│ │ └── logo.png
│ └── main.js
└── webpack.config.js
package.json
{
"author": "maomincoding",
"main": "dist/marquee.js",
"license": "ISC",
"keywords": ["marquee"],
"private": false,
}
author
的值为npm用户名
,这里一定要注意。
main
的值为你刚才打包的路径文件
license
的值按照以上即可
keywords
为用户搜索的关键词
private
设为false
, 开源因此需要将这个字段改为 false
.gitignore
可以 删除 dist/
字段,提交的时候一并上传上去。
.DS_Store
node_modules/
dist/
npm-debug.log
yarn-error.log
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
README.md
这是你上传之后的自述文件,可以在网页上显示,用的也是md语法,这里就不显示代码了,来张网页图示范,也可以直接去marquee查看说明
marquee/
npm config get registry
如果是 https://registry.npm.taobao.org
那么,输入以下命令,切换到http://registry.npmjs.org
npm config set registry=http://registry.npmjs.org
npm login
相继输入用户名、密码、邮箱。
回车出现Logged in as maomincoding on http://registry.npmjs.org
,那么就登陆成功了
3、上传发布
npm publish
替代marquee标签的文字横向滚动Vue插件
# install dependencies
npm i marquee-components
在main.js引入
import marquee from 'marquee-components'
Vue.use(marquee );
在页面使用
<template>
<div id="app">
<marquee :val="msg">marquee>
div>
template>
<script>
export default {
name: 'app',
data () {
return {
msg: 'vuevuevuevuevuevuevuevuevuevuevuevuevuevuevuevuevue'
}
}
}
script>
val
后加文字即可,当超过文本容器长度时,触动横向滚动效果。
当你想撤销上传的包时,你可以看看下面的说明:
撤销的坏处:
所以,慎行!!!
撤销命令:
npm unpublish 包名 --force
送给你一句官方说的话
I sure hope you know what you are doing
看到了撤销的坏处,所以我推荐你更新包。
更新包很简单,只需两步:
package.json
找到version
字段具体体现为:
"version":"a.b.c"
1.修复bug,小改动,c加1
2.增加了新特性,但仍能向后兼容,b加1
3.有很大的改动,无法向后兼容,a加1
npm publish
npm publish
这里是以发布Vue插件为例,你也可以单独发布一个包。
1、输入命令
npm init
根据自己的情况输入然后回车,会自动生成一个package.json
文件
{
"name": "vue-cli-configjs",
"version": "2.0.0",
"description": "vue.config.js by vue-cli3+",
"main": "vue.config.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"vue-cli-config"
],
"author": "maomincoding",
"license": "ISC"
}
2、然后建一个readme.md
自述文件,用于说明
3、最后发布即可
npm publish