npm包發佈記錄

来源:https://www.cnblogs.com/lifefriend/archive/2018/12/30/10200756.html
-Advertisement-
Play Games

下雪了,在家閑著,不如寫一個npm 包發佈。簡單的 npm 包的發佈網上有很多教程,我就不記錄了。這裡記錄下,一個複雜的 npm 包發佈,複雜指的構建環境複雜。 整個工程使用 rollup 來構建,其中會引進 babel 來轉譯 ES6,利用 Eslint 來規範代碼的書寫風格,最後代碼的發佈會經過 ...


下雪了,在家閑著,不如寫一個npm 包發佈。簡單的 npm 包的發佈網上有很多教程,我就不記錄了。這裡記錄下,一個複雜的 npm 包發佈,複雜指的構建環境複雜。

整個工程使用 rollup 來構建,其中會引進 babel 來轉譯 ES6,利用 Eslint 來規範代碼的書寫風格,最後代碼的發佈會經過 uglify 壓縮。同時發佈 umd、es 格式的版本以供外部調用。

完整目錄結構如下:

下麵是整個過程的記錄

一、初始化工程

yarn init -y

初始化後,修改 package.json 內容,如 name(項目名),description(項目描述)等信息。


二、安裝 rollup

yarn add rollup@1.0.0 --dev

 

三、創建配置文件 rollup.config.js

1 export default {
2     input: 'src/index.js',
3     output: {
4         file: 'index.common.js',
5         format: 'umd',
6         name: 'index'
7     }
8 }    

 

四、安裝 babel

yarn add rollup-plugin-babel@4.2.0 @babel/core@7.2.2 @babel/preset-env@7.2.3 --dev

 

五、配置 babel

1、創建配置文件 .babelrc

 1 {
 2   "presets": [
 3    [
 4     "@babel/preset-env",
 5     {
 6      "modules": false
 7     }
 8    ]
 9   ]
10 }

 

2、與 rollup 集成,在 rollup.config.js 中配置 plugins

 1 import babel from 'rollup-plugin-babel'
 2 
 3 export default {
 4   input: 'src/index.js',
 5   output: {
 6     file: 'index.common.js',
 7     format: 'umd',
 8     name: 'index'
 9   },
10   plugins: [
11     babel({
12       exclude: 'node_modules/**',
13       runtimeHelpers: true
14     })
15   ]
16 }

 

六、安裝 eslint

yarn add eslint@5.11.1

 

七、配置 eslint

1、生成 eslint 配置

.\node_modules\.bin\eslint --init

 

2、與 rollup 集成,在 rollup.config.js 中配置 plugins

 1 import babel from 'rollup-plugin-babel'
 2 import { eslint } from 'rollup-plugin-eslint'
 3 
 4 export default {
 5   input: 'src/index.js',
 6   output: {
 7     file: 'index.common.js',
 8     format: 'umd',
 9     name: 'index'
10   },
11   plugins: [
12     eslint({
13       include: ['src/**'],
14       exclude: ['node_modules/**']
15     }),
16     babel({
17       exclude: 'node_modules/**',
18       runtimeHelpers: true
19     })
20   ]
21 }

 

八、commonjs 相容

yarn add rollup-plugin-commonjs@9.2.0 rollup-plugin-node-resolve@4.0.0 --dev

 

九、與 rollup 集成,在 rollup.config.js 中配置 plugins

 1 import babel from 'rollup-plugin-babel'
 2 import { eslint } from 'rollup-plugin-eslint'
 3 import resolve from 'rollup-plugin-node-resolve'
 4 import commonjs from 'rollup-plugin-commonjs'
 5 
 6 export default {
 7   input: 'src/index.js',
 8   output: {
 9     file: 'index.common.js',
10     format: 'umd',
11     name: 'index'
12   },
13   plugins: [
14     resolve({
15       jsnext: true,
16       main: true,
17       browser: true
18     }),
19     commonjs(),
20     eslint({
21       include: ['src/**'],
22       exclude: ['node_modules/**']
23     }),
24     babel({
25       exclude: 'node_modules/**',
26       runtimeHelpers: true
27     })
28   ]
29 }

 

十、安裝 UglifyJS, 用來壓縮代碼

yarn add rollup-plugin-uglify@6.0.0 rollup-plugin-uglify-es@0.0.1 --dev

 

十一、與 rollup 集成,在 rollup.config.js 中配置 plugins

 1 import babel from 'rollup-plugin-babel'
 2 import { eslint } from 'rollup-plugin-eslint'
 3 import resolve from 'rollup-plugin-node-resolve'
 4 import commonjs from 'rollup-plugin-commonjs'
 5 import { uglify } from 'rollup-plugin-uglify'
 6 
 7 export default {
 8   input: 'src/index.js',
 9   output: {
10     file: 'index.common.js',
11     format: 'umd',
12     name: 'index'
13   },
14   plugins: [
15     resolve({
16       jsnext: true,
17       main: true,
18       browser: true
19     }),
20     commonjs(),
21     eslint({
22       include: ['src/**'],
23       exclude: ['node_modules/**']
24     }),
25     babel({
26       exclude: 'node_modules/**',
27       runtimeHelpers: true
28     }),
29     uglify()
30   ]
31 }

 

十二、引入環境變數,實踐差異化打包

1、安裝插件

yarn add rollup-plugin-replace@2.1.0 --dev

 

2、配置 plugins

 1 import babel from 'rollup-plugin-babel'
 2 import { eslint } from 'rollup-plugin-eslint'
 3 import resolve from 'rollup-plugin-node-resolve'
 4 import commonjs from 'rollup-plugin-commonjs'
 5 import { uglify } from 'rollup-plugin-uglify'
 6 import replace from 'rollup-plugin-replace'
 7 
 8 export default {
 9   input: 'src/index.js',
10   output: {
11     file: 'index.common.js',
12     format: 'umd',
13     name: 'index'
14   },
15   plugins: [
16     resolve({
17       jsnext: true,
18       main: true,
19       browser: true
20     }),
21     commonjs(),
22     eslint({
23       include: ['src/**'],
24       exclude: ['node_modules/**']
25     }),
26     babel({
27       exclude: 'node_modules/**',
28       runtimeHelpers: true
29     }),    
30     replace({
31       exclude: 'node_modules/**',
32       ENVIRONMENT: JSON.stringify(process.env.NODE_ENV)
33     }),
34     uglify()
35   ]
36 }

 

十三、參數化配置,加入版權說明,最終配置如下

 1 import resolve from 'rollup-plugin-node-resolve'
 2 import commonjs from 'rollup-plugin-commonjs'
 3 import { eslint } from 'rollup-plugin-eslint'
 4 import babel from 'rollup-plugin-babel'
 5 import replace from 'rollup-plugin-replace'
 6 import { uglify } from 'rollup-plugin-uglify'
 7 import uglifyEs from 'rollup-plugin-uglify-es'
 8 
 9 const pJson = require('./package.json')
10 
11 const version = pJson.version
12 const license = pJson.license
13 
14 const banner =
15   '/*!\n' +
16   ` * ${pJson.name} v${version}\n` +
17   ` * (c) 2018-${new Date().getFullYear()}\n` +
18   ` * Released under the ${license} License.\n` +
19   ' */'
20 
21 const ENV = process.env.NODE_ENV.trim()
22 
23 const paths = {
24   input: {
25     root: 'src/index.js'
26   },
27   output: {
28     root: 'dist/'
29   }
30 }
31 
32 const fileNames = {
33   development: 'index.common.js',
34   production: 'index.common.js',
35   production6: 'index.esm.js'
36 }
37 const fileName = fileNames[ENV]
38 
39 export default {
40   input: `${paths.input.root}`,
41   output: {
42     file: `${paths.output.root}${fileName}`,
43     format: ENV === 'production6' ? 'es' : 'umd',
44     name: 'index',
45     banner
46   },
47   plugins: [
48     resolve({
49       jsnext: true,
50       main: true,
51       browser: true
52     }),
53     commonjs(),
54     eslint({
55       include: ['src/**'],
56       exclude: ['node_modules/**']
57     }),
58     babel({
59       exclude: 'node_modules/**',
60       runtimeHelpers: true
61     }),
62     replace({
63       exclude: 'node_modules/**',
64       ENVIRONMENT: JSON.stringify(process.env.NODE_ENV)
65     }),
66     (ENV === 'production') && uglify({ output: { comments: /^!/ } }),
67     (ENV === 'production6') && uglifyEs({ output: { comments: /^!/ } })
68   ]
69 }

 

三、業務代碼編寫

在 src/index.js 中編寫具體業務代碼

 

四、打包

在 package.json 中添加

1 "scripts": {
2     "dev": "set NODE_ENV=development && rollup -c",
3     "build": "yarn run buildcjs && yarn run buildesm",
4     "buildcjs": "set NODE_ENV=production && rollup -c",
5     "buildesm": "set NODE_ENV=production6 && rollup -c"
6 }

 

運行命令

yarn run build

 

五、發佈

npm publish

 

發佈前記得記得 註冊  帳號,記得修改 package.json 中 private 欄位為 false

"private": false

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一 必須參數 需要在配置文件中設置這些參數。如果用戶更新它們harbor.cfg並運行install.sh腳本以重新安裝Harbor,它們將生效。 hostname:目標主機的主機名,用於訪問UI和註冊服務。必須為目標電腦的IP地址或完全限定的功能變數名稱(FQDN),例如192.168.1.10或reg ...
  • 之前我自己建立好了一個資料庫xscj;表xs是已經定義好的 具體的定義數據類型如下: 為了複製表xs,我們新建一個表名為xstext,使用下列語句進行複製xs,或者說是備份都可以; 我們可以看到,複製的表的欄位與xs表的欄位相同,不同之處在於複製的表沒有主鍵或主碼,同時複製的表裡存儲了與原表相同的信 ...
  • 簡介 一系列binlog文件和一個index文件組成 binlog文件以一個4位元組的常量作為開頭(表示這是一個binlog文件) 後面跟著一系列binlog事件 作用 複製 備份恢復 崩潰恢復(啟用binlog,採用事物的兩階段提交協議,事務在存儲引擎中的可能為prepared和commit) bi ...
  • 【作者】 王棟:攜程技術保障中心資料庫專家,對資料庫疑難問題的排查和資料庫自動化智能化運維工具的開發有強烈的興趣。 【問題描述】 最近我們有多台MongoDB的伺服器CentOS 7.1系統發生了crash,會不定期的自動重啟。 【排查思路】 1、碰到linux系統crash的問題,我們首先想到的是 ...
  • ETL項目2:大數據清洗,處理:使用MapReduce進行離線數據分析並報表顯示完整項目 思路同我之前的博客的思路 https://www.cnblogs.com/symkmk123/p/10197467.html 但是數據是從web訪問的數據 avro第一次過濾 觀察數據的格式,我們主要分析第四個 ...
  • 1、在一個form表單中,若只有一個input(不管type是什麼),按回車鍵表單會自動提交,但是當表單中存在多個input時,按回車鍵不會執行任何操作,這是form表單的一個特性。 2、在一個表單中若存在一個input是submit,則按回車表單會提交;如果不想用提交按鈕,可以用樣式隱藏。 3、f ...
  • 當有這樣的需求:點擊某些區域(對應html標簽)時執行一些操作,點擊其它區域執行不同的操作; 對於某些操作,假設A為點擊有效作用域,那麼B為無效域(即點擊B無法觸發這些操作),有以下兩個步驟獲得A: 1、判斷點擊事件是否作用於A本身(即html標簽A本身); 2、判斷點擊事件是否發生在A內部(即ht ...
  • 錯誤提示如下: 可能原因: IIS的MIME中未註冊MP4、ogg、webm相關類型,導致IIS無法識別 解決方法: 在IIS中註冊MP4、ogg、webm類型,以下以MP4為例,ogg和webm以此類推 字體文件類似 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...