Rollup从入门到入坑(2)引入第三方库

到目前为止,我们已经可以使用Rollup编译本地代码,但有些时候,借助社区的力量可以使我们的程序编写更高效。
ms为例

引入第三方模块

npm i -s ms

修改src/index.js

// src/index.js
import ms from 'ms';

export default function hourToSeconds(hours) {
    return ms(`${hours}h`);
}

非常简单的导出一个方法,用于将小时转换为秒。
此时的rollup.config.js

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

当运行npm run build,显示以下错误。
Unresolved dependencies
提示 Unresolved dependencies
https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency
打开链接
external dependency
大意是 Rollup 默认只解析相对路径的模块,对于以绝对路径引入的模块,不会作为bundle的一部分引入,这种模块会作为运行时的外部依赖,如果你就是想这样,你可以将模块id写入external数组。
如果你不想让你的模块运行时依赖这种第三方引入的模块,你需要让Rollup找到并将其一并打包到bundle中 可以使用@rollup/plugin-node-resolve
对于一些在node.js模块,如果想要运行在浏览器端 可能会需要 rollup-plugin-node-polyfills
直接引入该模块

npm i -D @rollup/plugin-node-resolve

同时修改rollup配置文件

// rollup.config.js
import resolve from '@rollup/plugin-node-resolve';

export default {
    input: 'src/index.js',
    output: {
      file: 'dist/bundle.js',
      format: 'cjs',
      // name: 'howlong'
    },
    plugins: [
      resolve()
    ]
  };

再次build,又报错,还是个Error,好像问题更大了。
no default
点击链接
plugin-common
原因是ms模块没有默认的导出声明,可以使用@rollup/plugin-commonjs来尝试解决此类问题,但因为CommonJS的自由性,可能会需要手动配置。ms这个库由于是官方demo中的一个简单的第三方库,所以不需要任何额外的配置,只需引入@rollup/plugin-commonjs即可。
安装插件

npm i -D @rollup/plugin-commonjs

编辑配置文件

// rollup.config.js
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';

export default {
  input: 'src/index.js',
  output: {
    file: 'dist/bundle.js',
    format: 'cjs',
  },
  plugins: [
    resolve(),
    commonjs()
  ]
};

再次 npm run build,可以看到编译通过,并且将ms的代码也打包进了我们的模块文件。

本节,我们引入了第三方的库函数,通过Rollup的报错信息的引导引入了两个插件,对Rollup插件有了基本的认识。

参考

rollup-starter-lib

Rollup是一个JavaScript模块打包工具,它通过静态分析来构建应用程序,通常用于处理CommonJS、ES6模块以及umd模块。当你想在Rollup打包过程中忽略特定第三方库对`window`全局变量的依赖时,可以采取以下几个步骤: 1. **明确外部导**:对于那些你希望保持原样并直接在浏览器全局上下文中使用的第三方库,可以将它们标记为外部导(external)。在Rollup配置文件(`rollup.config.js`)中添加类似这样的条目: ```javascript import { resolve } from 'rollup-plugin-node-resolve'; import { terser } from 'rollup-plugin-terser'; export default { input: 'src/index.js', output: { file: 'dist/bundle.js', format: 'iife', // 将模块包裹成立即执行函数,避免污染全局 }, plugins: [ resolve({ external: ['path/to/third-party-lib'], // 指定需要忽略的库 }), terser(), ], }; ``` 2. **条件加载**:如果某些第三方库确实需要修改其对`window`的访问,你可以考虑使用插件如`@rollup/plugin-commonjs`来处理,然后在代码中使用条件判断来控制何时引入。 3. **手动替换**:有些库可能会直接引用`window`,这时你需要找到这些引用并手动替换为`this`或其他合适的上下文,以避免全局污染。 注意:尽管以上方法可以帮助减少`window`的污染,但如果你的项目中有许多这样的情况,可能会影响代码的清晰度和维护性。最好的做法还是尽量让第三方库的使用符合模块化原则。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值