<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          實(shí)例創(chuàng)建自己的npm包,發(fā)布npm包并使用

          共 7712字,需瀏覽 16分鐘

           ·

          2021-04-06 11:44

          作者:李洪威

          來(lái)源:SegmentFault 思否社區(qū)

          前言:


          npm 是 Node.js 官方提供的包管理工具,項(xiàng)目中我們經(jīng)常用到npm包(”npm install xxx”),我們?yōu)槭裁葱枰猲pm,我的理解是npm是為了解決:代碼復(fù)用;因?yàn)榛谝延械某墒齑a快速開(kāi)發(fā)新的應(yīng)用,可以極大地提高開(kāi)發(fā)效率,“不要重復(fù)造輪子”;

          為什么要?jiǎng)?chuàng)建自己的npm包?平時(shí)項(xiàng)目積累的公共方法,可以封裝起來(lái),發(fā)布到自己的npm包,以便我們?cè)陧?xiàng)目中方便復(fù)用;

          創(chuàng)建簡(jiǎn)單npm包:


          文件結(jié)構(gòu)目錄:

          js-utils

          --src

          ----base.js

          ----validate.js

          --index.js

          base.js文件:

          const BaseMethods = {
              /**
               * 獲取數(shù)據(jù)類(lèi)型
               * @param params 
               * @returns 'String','Number'...
               */
              getTypeOf: (params) => {
                  let type = Object.prototype.toString.call(params)
                  return type.match(/\[\w+\W(\w+)\]$/)[1]
              },
              /**
               * 數(shù)組,字符串去重
               * @param Array,String
               * @returns 
               */
              unique: (params) => {
                  if (this.getTypeOf(params) === 'Array') {
                      return [...new Set(arr)]
                  }
                  if (this.getTypeOf(params) === 'String') {
                      let obj = {}
                      let str = ''
                      for(let i = 0, len = params.length; i < len; i++) {
                          if (obj[params[i]]) {
                              str += params[i]
                              obj[params[i]] = true
                          }
                      }
                      return str
                  }
                  
              }
          }

          export default BaseMethods

          validare.js文件:

          const Validate = {
              /**
               * 手機(jī)號(hào)校驗(yàn)
               */
              mobileCheck: (mobile) => {
                  let reg = /^[1][3,4,5,7,8][0-9]{9}$/
                  return reg.test(mobile)
              }
          }

          export default Validate

          index.js文件:

          import BaseMethods from './src/base'
          import Validate from './src/validate'

          export default {
              BaseMethods,
              Validate
          }

          在文件夾js-utils執(zhí)行命令: npm init 用來(lái)初始化生成package.json,它是 NodeJS 約定的用來(lái)存放項(xiàng)目的信息和配置等信息的文件

          將包上傳發(fā)布到npm


          1、登錄npm官網(wǎng)(https://www.npmjs.com/),注冊(cè)一個(gè)npm賬號(hào)(然后注冊(cè)完后,去你的郵箱根據(jù)提示進(jìn)行操作,驗(yàn)證通過(guò)即可)

          2、在文件夾js-utils執(zhí)行登錄命令:npm login ,輸入你在npm官網(wǎng)的賬號(hào)、密碼和郵箱

          注意:發(fā)現(xiàn)報(bào)錯(cuò),需要將淘寶鏡像去掉,還原成官方鏡像,執(zhí)行命令: npm config delete registry

          或者直接切換鏡像:
          設(shè)置淘x,寶的是:
          npm config set registry 
          https://registry.npm.taobao.org
          不想用他們的,再設(shè)置回原來(lái)的就可以了:
          npm config set registry 
          https://registry.npmjs.org
          還原成官方鏡像,npm login登陸成功;如下圖:
          登錄成功后,執(zhí)行命令: npm publish 來(lái)發(fā)布上傳你的包

          注意:發(fā)現(xiàn)報(bào)錯(cuò),js-utils包名被使用,package.json文件中更改 "name": "js-utils-mvp",再次執(zhí)行npm publish成功了,如下圖:


          使用npm包:


          新建test文件在項(xiàng)目中使用你已經(jīng)發(fā)布的包,執(zhí)行命令:npm install js-utils-mvp,如下圖:

          不需要跟著操作--begin
          在test文件下面新建index.html頁(yè)面;分別通過(guò)下面require或者import方式引入發(fā)現(xiàn)均報(bào)錯(cuò):(新增index.html可以不用跟著做,只為了引入問(wèn)題
          <script>
          // let jsUtils = require('js-utils-mvp')
          //import jsUtils from 'js-utils-mvp'
          </script>
          原因:
          1、require()不是JavaScript標(biāo)準(zhǔn)的一部分,瀏覽器不提供即用的支持,它是node.js模塊系統(tǒng).

          2、無(wú)法在模塊外部使用import語(yǔ)句,因?yàn)镸odule 的加載實(shí)現(xiàn)的是es6語(yǔ)法

          不需要跟著操作--end
          綜上,發(fā)現(xiàn)創(chuàng)建的npm包js-utils-mvp還存在兼容性問(wèn)題;如何解決瀏覽器不支持ES6的特性;
          1、Babel是一個(gè)廣泛使用的轉(zhuǎn)碼器,babel可以將ES6代碼完美地轉(zhuǎn)換為ES5代碼;
          2、webpack 是一個(gè)用于現(xiàn)代 JavaScript 應(yīng)用程序的 _靜態(tài)模塊打包工具,可以借助babel-loader幫我們將ES6代碼完轉(zhuǎn)換為ES5代碼;_

          項(xiàng)目引入webpack打包工具


          1、局部安裝,執(zhí)行命令: 
          npm install [email protected] webpack-cli -D
          注意:這里有坑要,我webpack不鎖定安裝版本的話,默認(rèn)安裝到5以上的版本,導(dǎo)致打包出來(lái)的文件為空,也沒(méi)報(bào)錯(cuò)。。所以鎖定版本
          2、js-utils文件下新建 webpack.config.js 文件
          const path = require('path')
          module.exports = {
              // 入口文件
              entry: './index.js',
              // 輸出配置
              output: {
                  path: path.resolve(__dirname, 'build'),
                  filename: 'jsUtils.js'
              },
              module: {
                  rules: [
                      {
                          test: /\.js$/,
                          exclude: /node_modules/,
                          use: {
                          loader: "babel-loader",
                          options: {
                              presets: ['@babel/preset-env']
                          }
                          }
                      }
                  ]
              }
              
          }
          3、babel-loader在webpack中配置
          (參照
          https://www.babeljs.cn/setup#installation
          執(zhí)行命令:npm install --save-dev babel-loader @babel/core
          babel-loader是webpack 與 babel的通信橋梁,不會(huì)做把es6轉(zhuǎn)成es5的工作,這部分工作需要用到@babel/preset-env來(lái)做,所以還要
          執(zhí)行命令:npm install @babel/preset-env --save-dev
          4、package.json中新增
          "scripts": {
              "build""npx webpack --config webpack.config.js"
            },

          npx webpack --config webpack.config.js //指定webpack使用webpack.config.js文件來(lái)作為配置文件并執(zhí)行;
          5、執(zhí)行打包命令:
          npm run build;打包生成的build文件下面的jsUtils.js文件,以供使用

          6、更改package.json中mian字段
          "main": "index.js",更改為 "main": "/build/jsUtils.js"
          因?yàn)楫?dāng)我們?cè)诓煌h(huán)境下 import 一個(gè) npm 包時(shí),到底加載的是 npm 包的哪個(gè)文件?
          答案是:main 字段中指定的文件。(這才是我們通過(guò)webpack和babel打包處理過(guò)后的文件)
          以上已經(jīng)完成了制作一個(gè)簡(jiǎn)單的npm包并發(fā)布,再次更新上傳到npm

          注意:每次更新上傳,記得在package.json中更改版本號(hào),如:
          "version": "1.0.0",更改為"version": "1.0.1",再次重復(fù)上圖更新發(fā)布指令就成功了

          項(xiàng)目中引用js-utils-mvp


          執(zhí)行命令:npm i js-utils-mvp -D
          import jsUtilsMvp from 'js-utils-mvp'
          console.log(jsUtilsMvp.BaseMethods.getTypeOf(88))  // 輸出:Numbe



          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開(kāi)更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號(hào)后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -


          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  巨乳波霸在线 | 日韩成人无码一区二区视频 | 亚洲精品久久久久久久久久久 | 亚洲∨一 | 中文字幕在线播放第一页 |