从零开始掌握rollopjs

473 阅读4分钟

Rollup 是一个 JavaScript 模块打包工具,可以将多个小的代码片段编译为完整的库和应用。与传统的 CommonJS 和 AMD 这一类非标准化的解决方案不同,Rollup 使用的是 ES6 版本 Javascript 中的模块标准。最适合打包纯js开发的类库。

ES6 版本的 Javascript 最终带来了importexport的语法(ES6 Module,译者注),该语法可以让我们在多个脚本中共享函数和数据。有了 Rollup,你现在就可以放心地使用新的模块标准来书写代码,并将其编译为当前被广泛支持的 CommonJS、AMD 以及 IIFE 等导入风格的环境下的多种格式。

使用场景:

当需要构建复杂的应用时选择Webpack,因为它可以对所有的静态资源( js / json / css / img / sass / less / …)进行模块依赖管理和项目代码分割。

如果要开发类js库时,那毫无疑问Rollup是最合适的选择,它可以做ES转换,模块解析,去除多余的代码等。

1 创建项目

新建一个空文件夹,例如起名:rollupTest,初始化项目

npm init -y

2 安装rollup

npm install rollup -S

3 创建rollup.config.js配置文件

这个配置文件并不是必须的,因为配置可选的配置文件的方式比较简单方便,所以我们选择配置文件。也可以不用配置文件,选择使用命令行来进行配置编译,命令行详见:rollupjs.org/guide/en/#c…

配置选项如下图所示:详情见:

// rollup.config.jsexport default { // 可以是一个数组(用于多个输入的情况)
  // 核心的输入选项
  external,
  input, // 必要项
  plugins,
​
  // 高级输入选项
  cache,
  onwarn,
  preserveEntrySignatures,
  strictDeprecations,
​
  // 危险区
  acorn,
  acornInjectPlugins,
  context,
  moduleContext,
  preserveSymlinks,
  shimMissingExports,
  treeshake,
​
  // 实验性
  experimentalCacheExpiry,
  perf,
​
  output: { // 必要项 (可以是一个数组,用于多输出的情况)
    // 核心的输出选项
    dir,
    file,
    format, // 必要项
    globals,
    name,
    plugins,
​
    // 高级输出选项
    assetFileNames,
    banner,
    chunkFileNames,
    compact,
    entryFileNames,
    extend,
    footer,
    hoistTransitiveImports,
    inlineDynamicImports,
    interop,
    intro,
    manualChunks,
    minifyInternalExports,
    outro,
    paths,
    preserveModules,
    sourcemap,
    sourcemapExcludeSources,
    sourcemapFile,
    sourcemapPathTransform,
​
    // 危险区
    amd,
    esModule,
    exports,
    externalLiveBindings,
    freeze,
    indent,
    namespaceToStringTag,
    noConflict,
    preferConst,
    strict,
    systemNullSetters
  },
​
  watch: {
    buildDelay,
    chokidar,
    clearScreen,
    skipWrite,
    exclude,
    include
  } | false
};

我们的rollup.config.js配置,我们想要构建支持ES模块规范的 bundle 和能在 Node.js 中运行的 CommonJS 规范的 bundle,我们可以配置一个数组,可以配置不同的选项来打包不同的规范文件。plugins先不用管,后面会介绍到

export default [{
    input: "./src/index.js",
    output: [
        {
            dir: "dist",
            format: "esm"
        },
        {
            dir: "dist",
            format: "cjs"
        }
    ]
}]

4 编写打包文件

4.1 编写要打包的js文件

新建src/object/deepClone.js文件,进行编写一个深拷贝的js函数。

目录结构如下:

Untitled 49.png

deepClone.js内容如下:

/**
 * @desc 深拷贝,支持常见数据类型
 * @param {Any} values
 * @return {Any}
 */
export function deepClone(values) {
    let copy;
​
    // 处理简单数据类型
    if (null == values || "object" != typeof values) return values;
​
    // 处理时间
    if (values instanceof Date) {
        copy = new Date();
        copy.setTime(values.getTime());
        return copy;
    }
​
    // 处理数组
    if (values instanceof Array) {
        copy = [];
        for (let i = 0, len = values.length; i < len; i++) {
            copy[i] = deepClone(values[i]);
        }
        return copy;
    }
​
    // 处理Object类型
    if (values instanceof Object) {
        copy = {};
        for (let attr in values) {
            if (values.hasOwnProperty(attr)) copy[attr] = deepClone(values[attr]);
        }
        return copy;
    }
​
    throw new Error("Unable to copy values! Its type isn't supported.");
}

4.2 编写打包的 ./src/index.js 入口文件

export { deepClone } from "./object/deepClone"

5 集成插件

Rollup 中,不能“开箱即用”所有功能,所以我们需要添加配置一些插件完成我们需要的功能。

安装:

5.1 Babel

转换未被支持的ES6ES5

npm install rollup-plugin-babel -S

5.2 @rollup/plugin-node-resolve

可以让 Rollup 查找到外部模块

npm install @rollup/plugin-node-resolve -S

5.3 @rollup/plugin-commonjs

用来将 CommonJS 转换成 ES2015 模块

npm install @rollup/plugin-commonjs -S

5.4 @rollup-plugin-terser

压缩代码

npm i rollup-plugin-terser -S

5.5 @rollup-plugin-cleanup

清楚无用的代码(注释)

npm i rollup-plugin-cleanup -S

暂时就介绍这么些,更多插件介绍请查看官方文档

配置:

import resolve from "@rollup/plugin-node-resolve";
import commonjs from "@rollup/plugin-commonjs";
import {terser} from "rollup-plugin-terser";
import cleanup from "rollup-plugin-cleanup";

export default [{
    input: "./src/index.js",
    output: [
        {
            dir: "dist",
            format: "esm"
        },
        {
            dir: "dist",
            format: "cjs"
        }
    ],
    plugins: [resolve(), commonjs(), terser(), cleanup()]
}]

6 添加打包脚本命令

package.json中添加一条脚本

"scripts": {
	"build": "rollup -c"
}

7 打包

运行构建命令:

npm run build

结果:

Untitled 1 7.png

打包输出的文件在./dist中。