首頁 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.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
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