摘要:下雪了,在家閑著,不如寫一個(gè)包發(fā)布。簡單的包的發(fā)布網(wǎng)上有很多教程,我就不記錄了。這里記錄下,一個(gè)復(fù)雜的包發(fā)布,復(fù)雜指的構(gòu)建環(huán)境復(fù)雜。同時(shí)發(fā)布格式的版本以供外部調(diào)用。
下雪了,在家閑著,不如寫一個(gè)npm 包發(fā)布。簡單的 npm 包的發(fā)布網(wǎng)上有很多教程,我就不記錄了。這里記錄下,一個(gè)復(fù)雜的 npm 包發(fā)布,復(fù)雜指的構(gòu)建環(huán)境復(fù)雜。
整個(gè)工程使用 rollup 來構(gòu)建,其中會(huì)引進(jìn) babel 來轉(zhuǎn)譯 ES6,利用 Eslint 來規(guī)范代碼的書寫風(fēng)格,最后代碼的發(fā)布會(huì)經(jīng)過 terser 壓縮。同時(shí)發(fā)布 umd、es 格式的版本以供外部調(diào)用。
完整目錄結(jié)構(gòu)如下:
下面是整個(gè)過程的記錄
一、初始化工程
yarn init -y
初始化后,修改 package.json 內(nèi)容,如 name(項(xiàng)目名),description(項(xiàng)目描述)等信息。
二、安裝 rollup
yarn add [email protected] --dev
三、創(chuàng)建配置文件 rollup.config.js
export default { input: "src/index.js", output: { file: "index.common.js", format: "umd", name: "index" } }
四、安裝 babel
yarn add [email protected] @babel/[email protected] @babel/[email protected] --dev
五、配置 babel
1、創(chuàng)建配置文件 .babelrc
{ "presets": [ [ "@babel/preset-env", { "modules": false } ] ] }
2、與 rollup 集成,在 rollup.config.js 中配置 plugins
import babel from "rollup-plugin-babel" export default { input: "src/index.js", output: { file: "index.common.js", format: "umd", name: "index" }, plugins: [ babel({ exclude: "node_modules/**", runtimeHelpers: true }) ] }
六、安裝 eslint
yarn add [email protected]
七、配置 eslint
1、生成 eslint 配置
. ode_modules.bineslint --init
2、與 rollup 集成,在 rollup.config.js 中配置 plugins
import babel from "rollup-plugin-babel" import { eslint } from "rollup-plugin-eslint" export default { input: "src/index.js", output: { file: "index.common.js", format: "umd", name: "index" }, plugins: [ eslint({ include: ["src/**"], exclude: ["node_modules/**"] }), babel({ exclude: "node_modules/**", runtimeHelpers: true }) ] }
八、commonjs 兼容
yarn add [email protected] [email protected] --dev
九、與 rollup 集成,在 rollup.config.js 中配置 plugins
import babel from "rollup-plugin-babel" import { eslint } from "rollup-plugin-eslint" import resolve from "rollup-plugin-node-resolve" import commonjs from "rollup-plugin-commonjs" export default { input: "src/index.js", output: { file: "index.common.js", format: "umd", name: "index" }, plugins: [ resolve({ jsnext: true, main: true, browser: true }), commonjs(), eslint({ include: ["src/**"], exclude: ["node_modules/**"] }), babel({ exclude: "node_modules/**", runtimeHelpers: true }) ] }
十、安裝 terser, 用來壓縮代碼
yarn add [email protected] --dev
十一、與 rollup 集成,在 rollup.config.js 中配置 plugins
import babel from "rollup-plugin-babel" import { eslint } from "rollup-plugin-eslint" import resolve from "rollup-plugin-node-resolve" import commonjs from "rollup-plugin-commonjs" import { terser } from "rollup-plugin-terser" export default { input: "src/index.js", output: { file: "index.common.js", format: "umd", name: "index" }, plugins: [ resolve({ jsnext: true, main: true, browser: true }), commonjs(), eslint({ include: ["src/**"], exclude: ["node_modules/**"] }), babel({ exclude: "node_modules/**", runtimeHelpers: true }), terser() ] }
十二、引入環(huán)境變量,實(shí)踐差異化打包
1、安裝插件
yarn add [email protected] --dev
2、配置 plugins
import babel from "rollup-plugin-babel" import { eslint } from "rollup-plugin-eslint" import resolve from "rollup-plugin-node-resolve" import commonjs from "rollup-plugin-commonjs" import { terser } from "rollup-plugin-terser" import replace from "rollup-plugin-replace" export default { input: "src/index.js", output: { file: "index.common.js", format: "umd", name: "index" }, plugins: [ resolve({ jsnext: true, main: true, browser: true }), commonjs(), eslint({ include: ["src/**"], exclude: ["node_modules/**"] }), babel({ exclude: "node_modules/**", runtimeHelpers: true }), replace({ exclude: "node_modules/**", ENVIRONMENT: JSON.stringify(process.env.NODE_ENV) }), terser() ] }
十三、參數(shù)化配置,加入版權(quán)說明,最終配置如下
import resolve from "rollup-plugin-node-resolve" import commonjs from "rollup-plugin-commonjs" import { eslint } from "rollup-plugin-eslint" import babel from "rollup-plugin-babel" import replace from "rollup-plugin-replace" import { terser } from "rollup-plugin-terser" const pJson = require("./package.json") const version = pJson.version const license = pJson.license const banner = "/*! " + ` * ${pJson.name} v${version} ` + ` * (c) 2018-${new Date().getFullYear()} ` + ` * Released under the ${license} License. ` + " */" const ENV = process.env.NODE_ENV.trim() const paths = { input: { root: "src/index.js" }, output: { root: "dist/" } } const fileNames = { development: "index.common.js", production: "index.common.js", production6: "index.esm.js" } const fileName = fileNames[ENV] export default { input: `${paths.input.root}`, output: { file: `${paths.output.root}${fileName}`, format: ENV === "production6" ? "es" : "umd", name: "index", banner }, plugins: [ resolve({ jsnext: true, main: true, browser: true }), commonjs(), eslint({ include: ["src/**"], exclude: ["node_modules/**"] }), babel({ exclude: "node_modules/**", runtimeHelpers: true }), replace({ exclude: "node_modules/**", ENVIRONMENT: JSON.stringify(process.env.NODE_ENV) }), ENV && ENV.includes("production") && terser({ output: { comments: /^!/ } }) ] }
三、業(yè)務(wù)代碼編寫
在 src/index.js 中編寫具體業(yè)務(wù)代碼
四、打包
在 package.json 中添加
"scripts": { "dev": "set NODE_ENV=development && rollup -c", "build": "yarn run buildcjs && yarn run buildesm", "buildcjs": "set NODE_ENV=production && rollup -c", "buildesm": "set NODE_ENV=production6 && rollup -c" }
運(yùn)行命令
yarn run build
五、發(fā)布
npm publish
發(fā)布前記得記得 注冊(cè) 帳號(hào),記得修改 package.json 中 private 字段為 false
"private": false
后記:[email protected] 在 [email protected] 時(shí)有警告,文章中原 rollup-plugin-uglify 被替換成 rollup-plugin-terser
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100548.html
摘要:如何選擇就如果上面所有,需要打包進(jìn)生產(chǎn)環(huán)境就保存到,只是在開發(fā)或者打包的時(shí)候使用的就保存到即可。提示不能發(fā)布當(dāng)前版本解決方案不能發(fā)布已經(jīng)發(fā)布的版本,修改一下版本號(hào)就可以了想不到了,想到了再寫資源項(xiàng)目 0x001 概述 本篇文章承接上文,記錄的是一些使用過程中的疑惑 0x001 墻的原因使得包下載太慢 解決方案:使用淘寶cnpm,推薦使用cnpm,因?yàn)槿绻薷膎pm倉庫,將會(huì)導(dǎo)致無法發(fā)布...
摘要:所以此版本號(hào)在這里的作用并不是用來區(qū)分版本的,小版本號(hào)才是真正用來做版本區(qū)分的,那么在引用這個(gè)就要這么來控制版本號(hào),舉個(gè)栗子鎖定大版本號(hào)和小版本號(hào),不管我們開發(fā)過程中提交了多少次,我們引用都是最新的。 最近在把公司內(nèi)部用的一個(gè)庫發(fā)布到內(nèi)網(wǎng)的npm私服上,僅僅是發(fā)布的話是比較簡單的,但這個(gè)庫是由多個(gè)人一起維護(hù)的,而且npm私服只有一套,所以生產(chǎn)環(huán)境和開發(fā)環(huán)境,用的是同一個(gè),那么,我們的需...
摘要:包說明包實(shí)際是一個(gè)存檔文件,即一個(gè)目錄直接打包為或格式的文件,安裝后解壓還原為目錄。完全符合規(guī)范的包目錄應(yīng)該包含如下這些文件包描述文件。用于存放單元測(cè)試用例的代碼。 keepsmiling說明 一些常用的函數(shù)集合,主要用到的技術(shù)如下: ES6的包處理方式; webpack打包方式; BDD測(cè)試用例,只寫了部分; 使用jsdoc生成注釋文檔; 你用eslint優(yōu)化代碼格式; 主...
摘要:我發(fā)布了我的第一個(gè)組件,一個(gè)基于的標(biāo)簽云組件。然后將這個(gè)編譯命令寫到里,如下那么以后要編譯下面的代碼,只需要執(zhí)行現(xiàn)在我們已經(jīng)有編譯好的代碼了,接下來就可以發(fā)布到供其他人使用了。 我發(fā)布了我的第一個(gè) npm 組件,一個(gè)基于 react 的 3d 標(biāo)簽云組件。在這途中我也是遇到了很多的坑,花在完善整個(gè)發(fā)布流程的時(shí)間遠(yuǎn)多于寫這個(gè)組件本身的時(shí)間,所以我記錄下我覺得一個(gè)正常的 react 組件的...
閱讀 484·2021-11-22 12:05
閱讀 1545·2021-11-17 09:33
閱讀 3590·2021-11-11 16:54
閱讀 2683·2021-10-14 09:49
閱讀 4062·2021-09-06 15:01
閱讀 1834·2019-08-29 17:23
閱讀 707·2019-08-29 14:09
閱讀 725·2019-08-29 12:28