下雪了,在家閒着,不如寫一個npm 包發佈。簡單的 npm 包的發佈網上有不少教程,我就不記錄了。這裏記錄下,一個複雜的 npm 包發佈,複雜指的構建環境複雜。javascript
整個工程使用 rollup 來構建,其中會引進 babel 來轉譯 ES6,利用 Eslint 來規範代碼的書寫風格,最後代碼的發佈會通過 terser 壓縮。同時發佈 umd、es 格式的版本以供外部調用。java
完整目錄結構以下:node
下面是整個過程的記錄shell
1、初始化工程npm
yarn init -y
初始化後,修改 package.json 內容,如 name(項目名),description(項目描述)等信息。json
2、安裝 rollupbabel
yarn add rollup@1.0.0 --dev
3、建立配置文件 rollup.config.jsui
export default { input: 'src/index.js', output: { file: 'index.common.js', format: 'umd', name: 'index' } }
4、安裝 babelspa
yarn add rollup-plugin-babel@4.2.0 @babel/core@7.2.2 @babel/preset-env@7.2.3 --dev
5、配置 babel插件
一、建立配置文件 .babelrc
{ "presets": [ [ "@babel/preset-env", { "modules": false } ] ] }
二、與 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 }) ] }
6、安裝 eslint
yarn add eslint@5.11.1
7、配置 eslint
一、生成 eslint 配置
.\node_modules\.bin\eslint --init
二、與 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 }) ] }
8、commonjs 兼容
yarn add rollup-plugin-commonjs@9.2.0 rollup-plugin-node-resolve@4.0.0 --dev
9、與 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 }) ] }
10、安裝 terser, 用來壓縮代碼
yarn add rollup-plugin-terser@4.0.0 --dev
11、與 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() ] }
12、引入環境變量,實踐差別化打包
一、安裝插件
yarn add rollup-plugin-replace@2.1.0 --dev
二、配置 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() ] }
十3、參數化配置,加入版權說明,最終配置以下
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 = '/*!\n' + ` * ${pJson.name} v${version}\n` + ` * (c) 2018-${new Date().getFullYear()}\n` + ` * Released under the ${license} License.\n` + ' */' 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: /^!/ } }) ] }
3、業務代碼編寫
在 src/index.js 中編寫具體業務代碼
4、打包
在 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" }
運行命令
yarn run build
5、發佈
npm publish
發佈前記得記得 註冊 賬號,記得修改 package.json 中 private 字段爲 false
"private": false
後記:rollup-plugin-uglify@6.0.0 在 rollup@1.0.0 時有警告,文章中原 rollup-plugin-uglify 被替換成 rollup-plugin-terser