首页 web前端 js教程 vue的todo-list组件怎么发布到npm

vue的todo-list组件怎么发布到npm

Apr 08, 2018 am 11:09 AM
发布 组件

这次给大家带来vue的todo-list组件怎么发布到npm,vue的todo-list组件发布到npm的注意事项有哪些,下面就是实战案例,一起来看一下。

前言

最近几个人合作完成了一个项目,发现有一些公用的基础业务组件,可以提取出来,不仅方便大家在各自模块直接引用,也可以在以后的项目中使用。想到了可不可以自己动手把组件打包发布到内部的npm上,避免以后小伙伴们的重复工作呢?于是乎,说干就干,在这里操练一下,写个todo-list的vue组件案例。案例源码:https://github.com/wuwhs/todoList

建立npm项目

1. 初始化npm项目

建一个文件夹(todoList),在这个文件夹路径下打开cmd窗口,输入指令npm init,前提是已经装好了node(自带npm)。

$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (todolist)
登录后复制

提示输入项目包名称,这里的名称将作为发布到npm上这个包的名称,以后别人使用就可以直接importrequire到项目中使用。

package name: (todolist) todolist
version: (1.0.0)
登录后复制

接下来提示输入版本,这里的版本将作为发布到npm上这个包版本控制号,每次发布必须要改一下版本号,才允许发布,在这里作为第一个版本可以直接回车,默认是1.0.0

version: (1.0.0)
description:
登录后复制

然后提示输入描述信息,描述一下这个包的功能作用。于是输入:

description: a vue component of todolist
entry point:(webpack.config.js)
登录后复制

再者,提示整个项目的入口文件,这里是我们打包后的文件,打包后文件都放到dist目录下,先设定生成的文件是todoList.min.js,于是:

entry point:(webpack.config.js) ./dist/todoList.min.js
test command:
git repository:
登录后复制

接下来提示输入测试命令、git仓库,先不管,后面再详细写,回车默认空。

再提示输入关键字,便于其他人在npm上搜索得到你写的包,最后就是作者和认证,根据自己实际情况填。

keywords: todolist vue
author: wuwhs
license: (ISC)
About to write to D:\WampServer\wamp\www\todoList\package.json:
{
 "name": "vue-todolist",
 "version": "1.0.0",
 "description": "a vue component of todolist",
 "main": "dist/todolist.min.js",
 "scripts": {
  "test": "echo \"Error: no test specified\" && exit 1"
 },
 "keywords": [
  "todolist",
  "vue"
 ],
 "author": "wuwhs",
 "license": "ISC"
}
Is this ok? (yes) yes
登录后复制

这样,一个npm项目就初始化完了。接下来,来发布一个已经打包好了的组件包(先为空的)到npm上。

发布包到npm上

首先需要有npm官网的一个注册账号,然后输入npm adduser,依次输入npm登录账号、密码和注册激活邮箱。这样就轻松的登录上了。(PS:在window的CMD窗口,输入密码时不显示输入密码,盲输入,确定后回车即可,这里被坑了一下)

$ npm adduser
Username: wuwhs
Password: balabala...
Email: (this IS public) balabala...
Logged in as wuwhs on https://registry.npmjs.org/.
登录后复制

最后,直接输入指令publish即可大功告成。

$ npm publish
+ vue-todolist@1.0.0
登录后复制

不过,好事多磨,可能事情没有那么顺利。

一个可能取的包名称跟别人的重名了,这样是不能上传上去的,会提示你没有权限发布这个包。

$ npm publish
npm ERR! publish Failed PUT 403
npm ERR! code E403
npm ERR! You do not have permission to publish "vue-router". Are you logged in as the correct user? : vue-router
npm ERR! A complete log of this run can be found in:
npm ERR!   C:\Users\Administrator\AppData\Roaming\npm-cache\_logs\2018-04-02T15_41_56_696Z-debug.log
登录后复制

解决方法:需要到package.json里改一下包名称name,或者去npm官网搜一下你要取的名称,有没有同名,再回头来改。

还有就是每次发布,没改版本号。

$ npm publish
npm ERR! publish Failed PUT 403
npm ERR! code E403
npm ERR! You cannot publish over the previously published versions: 1.0.1. : vue-todolist
npm ERR! A complete log of this run can be found in:
npm ERR!   C:\Users\Administrator\AppData\Roaming\npm-cache\_logs\2018-04-02T15_40_28_571Z-debug.log
登录后复制

解决方法:需要到package.json里改一下版本号后发布。

把npm线路打通了,接下来就是打包输出,上传资源了。

webpack打包

组件写好后,一般要借助自动化工具,将资源整合打包压缩,提供一个入口文件,供别人直接引用。在这里,选用webpack来打包。

为了方便演示,写一个vue官网上todo-list的例子,作为组件打包发布。

整个目录结构

--todoList
  --src
    --components
      --todoItem.vue
      --todoList.vue
    --App.vue
    --index.js
    --main.js
  --index.html
  --webpack.config.js
  --package.json
  --.babelrc
  --.npmignore
登录后复制

下面来分别说明文件内容:

1. package.json文件

{
 "name": "vue-todolist",
 "description": "a vue component of todolist",
 "version": "1.0.0",
 "author": "wuwhs",
 "license": "MIT",
 "private": false,
 "main": "./dist/todoList.min.js",
 "scripts": {
  "dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
  "build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
 },
 "dependencies": {
  "vue": "^2.5.11"
 },
 "browserslist": [
  "> 1%",
  "last 2 versions",
  "not ie <= 8"
 ],
 "devDependencies": {
  "babel-core": "^6.26.0",
  "babel-loader": "^7.1.2",
  "babel-preset-env": "^1.6.0",
  "babel-preset-stage-3": "^6.24.1",
  "cross-env": "^5.0.5",
  "css-loader": "^0.28.7",
  "file-loader": "^1.1.4",
  "vue-loader": "^13.0.5",
  "vue-template-compiler": "^2.4.4",
  "webpack": "^3.6.0",
  "webpack-dev-server": "^2.9.1"
 }
}
登录后复制

主要安装一些必要的依赖插件,如vue、babel和webpack

2. webpack.config.js文件

var path = require(&#39;path&#39;)
var webpack = require(&#39;webpack&#39;)
module.exports = {
 entry: &#39;./src/main.js&#39;,
 output: {
  path: path.resolve(dirname, &#39;./dist&#39;),
  publicPath: &#39;/dist/&#39;,
  filename: &#39;build.js&#39;
 },
 module: {
  rules: [
   {
    test: /\.css$/,
    use: [
     &#39;vue-style-loader&#39;,
     &#39;css-loader&#39;
    ],
   },   
   {
    test: /\.vue$/,
    loader: &#39;vue-loader&#39;,
    options: {
     loaders: {
     }
     // other vue-loader options go here
    }
   },
   {
    test: /\.js$/,
    loader: &#39;babel-loader&#39;,
    exclude: /node_modules/
   },
   {
    test: /\.(png|jpg|gif|svg)$/,
    loader: &#39;file-loader&#39;,
    options: {
     name: &#39;[name].[ext]?[hash]&#39;
    }
   }
  ]
 },
 resolve: {
  alias: {
   &#39;vue$&#39;: &#39;vue/dist/vue.esm.js&#39;
  },
  extensions: [&#39;*&#39;, &#39;.js&#39;, &#39;.vue&#39;, &#39;.json&#39;]
 },
 devServer: {
  historyApiFallback: true,
  noInfo: true,
  overlay: true
 },
 performance: {
  hints: false
 },
 devtool: &#39;#eval-source-map&#39;
}
if (process.env.NODE_ENV === &#39;production&#39;) {
 module.exports.devtool = &#39;#source-map&#39;
 module.exports.plugins = (module.exports.plugins || []).concat([
  new webpack.DefinePlugin({
   &#39;process.env&#39;: {
    NODE_ENV: &#39;"production"&#39;
   }
  }),
  new webpack.optimize.UglifyJsPlugin({
   sourceMap: true,
   compress: {
    warnings: false
   }
  }),
  new webpack.LoaderOptionsPlugin({
   minimize: true
  })
 ])
}
登录后复制

webpack的基本热更新以及打包配置,可以参考webpack中文官网

3. .babelrc文件

{
 "presets": [
  ["env", { "modules": false }],
  "stage-3"
 ]
}
登录后复制

ES6转化工具babel配置

4. main.js项目入口文件

import Vue from &#39;vue&#39;
import App from &#39;./App.vue&#39;
new Vue({
 el: &#39;#app&#39;,
 render: h => h(App)
})
登录后复制

5. App.vue vue根组件

<template>
 <p id="app">
  Hello, todo-list!
 </p>
</template>
<script>
export default {
 name: 'app'
}
</script>
登录后复制

6. index.html 页面

<!DOCTYPE html>
<html lang="en">
 <head>
  <meta charset="utf-8">
  <title>todolist</title>
 </head>
 <body>
  <p id="app"></p>
  <script src="./dist/build.js"></script>
 </body>
</html>
登录后复制

输入命令npm install,所有依赖包安装完成后,npm run dev,启动成功。

PS:遇到一个坑,先用npm install感觉太慢了,于是断掉了,用cnpm install,安装完成后,启动总是缺少这个依赖包,那个依赖包,没完没了,于是,把node_modules全删了,重新cnpm install一气呵成正常了。cnpm安装会引入一些版本文件,前面npm已装好的包没有,于是就出现了报错,找不到某某依赖包。

至此,打包工具webpack的基本配置就完成了,接下来就是写vue组件了。

写todo-list的vue组件

todo-list组件在很多地方都会作为一个案例使用,在这就直接模范vue官网的案例来写了。

1. todoList.vue组件——列表

<template>
<p">
 <input
  v-model="newTodoText"
  v-on:keyup.enter="addNewTodo"
  placeholder="Add a todo"
 >
 <ul>
  <li
   is="todo-item"
   v-for="(todo, index) in todos"
   v-bind:key="todo.id"
   v-bind:title="todo.title"
   v-on:remove="todos.splice(index, 1)"
  ></li>
 </ul>
</p>
</template>
<script>
import TodoItem from './TodoItem'
export default {
 components: {
  TodoItem
 },
 data () {
  return {
   newTodoText: '',
   todos: [
    {
     id: 1,
     title: 'Do the dishes',
    }
   ],
   nextTodoId: 2
  }
 },
 methods: {
  addNewTodo: function () {
   this.todos.push({
    id: this.nextTodoId++,
    title: this.newTodoText
   })
   this.newTodoText = ''
  }
 }
}
</script>
登录后复制

2. todoList.vue组件——列表项

减小耦合度,把列表项单独拿出来做一个组件。

<template>
<li>
 {{ title }}
 <button v-on:click="$emit(&#39;remove&#39;)">X</button>
</li>
</template>
<script>
export default {
 props: ['title']
}
</script>
登录后复制

3. App.vue根组件

将todo-list组件引入并挂载到根节点。

<template>
 <p id="app">
  <todo-list></todo-list>
 </p>
</template>
<script>
import TodoList from './components/todoList'
export default {
 name: 'app',
 components: {
  TodoList
 }
}
</script>
登录后复制

刷新浏览器,查看效果

OK,组件基本完成。

组件打包

前面已经验证了,我们写的todo-list组件没问题了,要将这个组件独立打包成一个文件。这时就需要更换一下入口文件了,把测试案例用的main.js换成index.js文件。

独立组件入口文件 index.js

目的只是将要打包的组件引入。

import TodoList from './components/todoList.vue'
export default TodoList
登录后复制

更改webpack配置 webpack.config.js

将入口文件更换成./src/index.js,文件出口路径和名称更换成package.jsonmain的路径和名称,这样方便不调整npm的发布目录。

module.exports = {
 entry: './src/index.js',
 output: {
  path: path.resolve(dirname, './dist'),
  publicPath: '/dist/',
  filename: 'todoList.min.js'
 },
 ...
}
登录后复制

改好后,npm run build,打包组件,结果就在dist目录下有了todoList.min.js文件。这就是打包组件后的文件。也是将要发布到npm上别人真正使用的入口文件。

测试打包好的文件

刚打包好的文件能不能直接使用,在发布到npm上之前先在本地测试一下。要测试方法很简单,就是把跟组件引入的vue组件改成引入刚打包的文件。于是App.vue这样改:

<script>
import TodoList from '../dist/todoList.min.js'
export default {
 name: 'app',
 components: {
  TodoList
 }
}
</script>
登录后复制

再改回测试案例入口,刷新浏览器,报错!

vue.esm.js?3153:591 [Vue warn]: Failed to mount component: template or render function not defined.
found in
---> <TodoList>
    <App> at src\App.vue
     <Root>
登录后复制

有点小奔溃,没有渲染函数?难道自己打包出来的组件竟然不能用!后来查资料才知道,打包需要指定一种模块输出类型,可以是commonjs,AMD,script,UMD模式。在这里是写插件,要采用UMD模式,即libraryTarget: 'umd'。于是webpack.config.js出口文件配置修改为:

 output: {
  path: path.resolve(dirname, './dist'),
  publicPath: '/dist/',
  filename: 'todoList.min.js',
  library: 'vueTodoList',
  libraryTarget: 'umd',
  umdNamedDefine: true
 }
登录后复制

再打包独立组件,更新todoList.min.js文件,改回测试文件(entry: './src/main.js',)入口,npm run dev,刷新浏览器,成功!

发布和使用npm组件包

发布npm组件包

已经验证了我们已经打包生成的todoList.min.js可以正常使用,接下来就可以发布到npm上了,同样npm跟git一样,可以使用.npmignore忽略一些上传文件,比如node_moudules就不要上传上去了。

.DS_Store
node_modules/
npm-debug.log
yarn-error.log
# Editor directories and files
.idea
.editorconfig
*.suo
*.ntvs*
*.njsproj
*.sln
登录后复制

更改一下package.jsonversion,执行npm publish即可

$ npm publish
+ vue-todolist@1.0.3
登录后复制

使用npm组件包

发布成功后,这就是一个平常使用的插件了,cnpm install vue-todolist --save即可安装(使用npm或cnpm安装均可)完成,

$ cnpm install vue-todolist --save
√ Installed 1 packages
√ Linked 1 latest versions
√ Run 0 scripts
Recently updated (since 2018-03-27): 1 packages (detail see file D:\appSoft\wampserver\wamp64\www\todoList\node_modules\.recently_updates.txt)
 Today:
  → vue-todolist@*(1.0.3) (11:15:22)
√ All packages installed (1 packages installed from npm registry, used 564ms, speed 528.68kB/s, json 2(281.56kB), tarball 16.62kB)
登录后复制

然后直接在页面中引入使用。

在App.vue引入todolist组件,就不需要引入本地写的了,直接引入刚才安装好的

<script>
import TodoList from 'vue-todolist'
export default {
 name: 'app',
 components: {
  TodoList
 }
}
</script>
登录后复制

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

AngularJS应用模块化的使用详解

JS怎样实现DOM插入节点

以上是vue的todo-list组件怎么发布到npm的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

小红书怎么发布作品 小红书怎么发布文章和图片 小红书怎么发布作品 小红书怎么发布文章和图片 Mar 22, 2024 pm 09:21 PM

  小红书你们可以查看到各种的内容,为你带来多样的帮助,让你发现更美好的生活,你有什么想要分享的话,也是可以在这里发布的,让大家都可以看一看,同时还能够为自己带来收益,非常的划算,有不懂怎么在这里发作品的,都可以查看教程,每天都可以使用这个软件,发布各种内容,帮助大家们更好的使用起来,有需要的都不要错过了!  1、打开小红书,点击下方加号图标。  2、这里有【视频】【图片】【实况图】选择;选择想要发布的内容点击勾选。  3、在内容编辑页选择【下一步】。  4、输入您想要发布的文字内容点击【发布笔

为什么小红书发布不了作品视频?它要怎么发布自己的作品? 为什么小红书发布不了作品视频?它要怎么发布自己的作品? Mar 21, 2024 pm 06:36 PM

随着社交媒体的迅速发展,短视频平台已成为许多用户展示自我、分享生活的主要渠道。在小红书发布作品视频时,许多用户可能会遇到各种问题。本文将讨论可能导致小红书作品视频发布失败的原因,并提供正确的发布方法。一、为什么小红书发布不了作品视频?小红书平台偶尔会发生系统故障,可能是由于系统维护或升级等原因造成的。在这种情况下,用户可能会遇到无法发布作品视频的问题。用户需要耐心等待平台恢复正常后再尝试发布。网络连接不稳定或速度缓慢可能会妨碍用户在小红书上发布作品视频。用户应当确认自己的网络环境,确保连接稳定且

为什么小红书发布不出去?小红书发布内容无法展示怎么办? 为什么小红书发布不出去?小红书发布内容无法展示怎么办? Mar 21, 2024 pm 07:47 PM

小红书作为一款生活方式分享平台,吸引了大量用户在此分享生活点滴、种草商品。不少用户反映,自己的发布内容无法展示,这究竟是怎么回事呢?本文将分析可能导致小红书发布不出去的原因,并给出解决办法。一、为什么小红书发布不出去?小红书执行严格的社区准则,对于发布广告、垃圾信息、低俗内容等行为持零容忍态度。如果用户的内容违反规定,系统会进行拦截,导致内容无法展示。小红书要求用户发布高质量、有价值的内容,内容需要具有独特性和新意。如果内容过于普通、缺乏创新,可能无法通过审核,从而无法在平台上展示。3.账号异常

小红书几点发布效果最好?它从哪里发布流量推荐最多? 小红书几点发布效果最好?它从哪里发布流量推荐最多? Mar 21, 2024 pm 08:11 PM

在当今的社交网络时代,小红书已经成为年轻人分享生活、获取资讯的重要平台。许多用户希望通过在小红书上发布内容,吸引更多的关注和流量。那么,什么时间发布内容效果最好呢?本文将详细探讨小红书发布时间的选择以及流量推荐最多的发布位置。一、小红书几点发布效果最好?小红书发布内容的最佳时机通常是在用户活跃度较高的时间段。根据小红书用户的特点和行为习惯,有几个时间段是比较适宜的。在晚上7点到9点这个时间段,大多数用户已经下班回到家,开始使用手机浏览内容,寻找放松和娱乐。因此,在这个时段发布的内容更有可能引起用

小红书发布怎么删除?发布删除怎么恢复? 小红书发布怎么删除?发布删除怎么恢复? Mar 21, 2024 pm 05:10 PM

小红书作为一家流行的社交电商平台,吸引了大量用户分享生活点滴和购物心得。有时候我们可能会不经意发布一些不合适的内容,这时候需要及时删除,这样可以更好地维护个人形象或者遵守平台规定。一、小红书发布怎么删除?1.登录小红书账号,进入个人主页。2.在个人主页下方,找到“我的创作”选项,点击进入。3.在“我的创作”页面,你可以看到所有发布的内容,包括笔记、视频等。4.找到需要删除的内容,点击右侧的“...”按钮。5.在弹出的菜单中,选择“删除”选项。6.确认删除后,该条内容将从你的个人主页和公共页面消失

如何安装Win10旧版本组件DirectPlay 如何安装Win10旧版本组件DirectPlay Dec 28, 2023 pm 03:43 PM

不少用户在玩win10的的一些游戏的时候总是会遇到一些问题,比如说卡屏和花屏等等情况,这个时候我们是可以采用打开directplay这个功能来解决的,而且功能的操作方法也很简单。win10旧版组件directplay怎么安装1、在搜索框里面输入“控制面板”然后打开2、查看方式选择大图标3、找到“程序和功能”4、点击左侧的启用或关闭win功能5、选择旧版这里的勾选上就可以了

小红书app如何进行发布作品呢 小红书app五分钟发布作品的教程 小红书app如何进行发布作品呢 小红书app五分钟发布作品的教程 Mar 12, 2024 pm 05:10 PM

  小红书app如何进行发布作品呢?很多的小伙伴们都知道在这款软件里面有着大量的创作作品以及强大的交友圈子。对于刚接触这款软件的用户们估计还不知道怎么进行发布作品吧,让更多的人去观看另一面的你。如果你还不知道怎么去发布里面的作品,那就赶紧参考一下又本站中的小编所推荐的小红书app五分钟发布作品的教程。小红书app五分钟发布作品的教程  1.点击【三】  如图所示,点击左上方红箭头所指的【三】。  2.点击【创作中心】  如图所示,点击红箭头所指的【创作中心】。  3.点击【去发布】  如图所示,

如何发布小红书视频作品?发视频要注意什么? 如何发布小红书视频作品?发视频要注意什么? Mar 23, 2024 pm 08:50 PM

随着短视频平台的兴起,小红书成为了许多人分享生活、表达自我、获取流量的平台。在这个平台上,发布视频作品是一种非常受欢迎的互动方式。那么,如何发布小红书视频作品呢?一、如何发布小红书视频作品?首先,确保准备好一段适合分享的视频内容。你可以利用手机或其他摄像设备进行拍摄,需要注意画质和声音的清晰度。2.剪辑视频:为了让作品更具吸引力,可以对视频进行剪辑。可以使用专业的视频剪辑软件,如抖音、快手等,添加滤镜、音乐、字幕等元素。3.选择封面:封面是吸引用户点击的关键,选择一张清晰、有趣的图片作为封面,让

See all articles