1.0.3 • Published 2 months ago

quick-libs v1.0.3

Weekly downloads
-
License
ISC
Repository
-
Last release
2 months ago

前言

基于 rollup 搭建一个库打包脚手架,来发布自己的库和组件。

使用

// 安装
npm install quick/libs
// 使用
import * as quick from 'quick/libs'

// 按需引入
import { json } from 'quick/libs'

rollup

rollup 入门

安装 rollup:

npm i rollup -g

//然后在本地创建一个项目:

mkdir -p my-project
cd my-project

rollup 的配置文件(rollup.config.js 在根目录下):

// rollup.config.js
export default {
  input: 'src/main.js',
  output: {
    file: 'bundle.js',
    format: 'cjs'
  }
};

rollup 插件

比较实用的插件有:

  • rollup-plugin-node-resolve ---帮助 Rollup 查找外部模块,然后导入
  • rollup-plugin-commonjs ---将 CommonJS 模块转换为 ES2015 供 Rollup 处理
  • rollup-plugin-babel --- 让我们可以使用 es6 新特性来编写代码
  • rollup-plugin-terser --- 压缩 js 代码,包括 es6 代码压缩
  • rollup-plugin-eslint --- js 代码检测

配置:

import resolve from 'rollup-plugin-node-resolve';
import commonjs from 'rollup-plugin-commonjs';
import babel from 'rollup-plugin-babel';
import { terser } from 'rollup-plugin-terser';
import { eslint } from 'rollup-plugin-eslint';

export default [
  {
    input: 'src/main.js',
    output: {
      name: 'timeout',
      file: '/lib/tool.js',
      format: 'umd'
    },
    plugins: [
      resolve(), // 这样 Rollup 能找到 `ms`
      commonjs(), // 这样 Rollup 能转换 `ms` 为一个ES模块
      eslint(),
      babel(),
      terser()
    ]
  }
];

利用 babel 来编译 es6 代码

首先我们先安装 babel 相关模块:

npm i core-js @babel/core @babel/preset-env @babel/plugin-transform-runtime

然后设置.babelrc 文件

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "modules": false,
        "useBuiltIns": "usage",
        "corejs": "2.6.10",
        "targets": {
          "ie": 10
        }
      }
    ]
  ],
  "plugins": [
      // 解决多个地方使用相同代码导致打包重复的问题
      ["@babel/plugin-transform-runtime"]
  ],
  "ignore": [
      "node_modules/**"
    ]
}

@babel/preset-env 可以根据配置的目标浏览器或者运行环境来自动将 ES2015+的代码转换为 es5。需要注意的是,我们设置"modules": false,否则 Babel 会在 Rollup 有机会做处理之前,将我们的模块转成 CommonJS,导致 Rollup 的一些处理失败。

为了解决多个地方使用相同代码导致打包重复的问题,我们需要在.babelrc 的 plugins 里配置@babel/plugin-transform-runtime,同时我们需要修改 rollup 的配置文件:

babel({
  exclude: 'node_modules/**', // 防止打包node_modules下的文件
  runtimeHelpers: true,       // 使plugin-transform-runtime生效
}),

区分测试环境和开发环境

我们可以在 package.json 中配置不同的执行脚本和环境变量来对开发和生产做不同的配置:

// package.json
"scripts": {
    "dev": "rollup -c -w --environment NODE_ENV:development",
    "build": "rollup -c --environment NODE_ENV:production",
    "test": "node test/test.js"
  },

手动导出 NODE_ENV 为 production 和 development 来区分生产和开发环境,然后在代码中通过 process.env.NODE_ENV 来获取参数。这里我们主要用来设置在开发环境下不压缩代码:

const isDev = process.env.NODE_ENV !== 'production';
// ...
plugins: [!isDev && terser()];

eslint 来做代码检测

使用 rollup-plugin-eslint 来配置:

eslint({
  throwOnError: true,
  throwOnWarning: true,
  include: ['src/**'],
  exclude: ['node_modules/**']
});

然后建立.eslintrc.js 来根据自己风格配置具体检测:

module.exports = {
  env: {
    browser: true,
    es6: true,
    node: true
  },
  extends: 'eslint:recommended',
  globals: {
    Atomics: 'readonly',
    SharedArrayBuffer: 'readonly',
    ENV: true
  },
  parserOptions: {
    ecmaVersion: 2018,
    sourceType: 'module'
  },
  rules: {
    'linebreak-style': ['error', 'unix'],
    quotes: ['error', 'single']
  }
};

external 属性

使用 rollup 打包,我们在自己的库中需要使用第三方库,例如 lodash 等,又不想在最终生成的打包文件中出现 jquery。这个时候我们就需要使用 external 属性。比如我们使用了 lodash,

import _ from 'lodash'

// rollup.config.js
{
    input: 'src/main.js',
    external: ['lodash'],
    globals: {
        lodash: '_'
    },
    output: [
      { file: pkg.main, format: 'cjs' },{ file: pkg.module, format: 'es' }
    ]
}

打包输出

导出成 commonjs 模块,es 模块,以及浏览器能识别的模块,通过如下方式设置:

{
  input: 'src/main.js',
  external: ['ms'],
  output: [
	{ file: pkg.main, format: 'cjs' },
	{ file: pkg.module, format: 'es' },
	{ file: pkg.module, format: 'umd' }
  ]
}

发布到 npm

如下方式配置 npm 账号,然后发布

#注册
npm adduser
#登陆
npm login
 #发布
npm publish

name 是包的名字,可以直接写包名,比如 loadash,或者添加域,类似于@koa/router 这种,@后面是你 npm 注册的用户名。key 为包的关键字。

1.0.3

2 months ago

1.0.2

10 months ago

1.0.1

10 months ago

1.0.0

10 months ago

0.0.4

4 years ago