【问题标题】:Tree shaking not working for node package摇树不适用于节点包
【发布时间】:2020-06-10 17:39:59
【问题描述】:

我有一个节点模块,它的形状通常是这样的(例如,为了简化):

# color.js

export var red = '#f00';
export var yellow = '#ff0';
export var blue = '#00f';
# images.js

export var image1 = '<base64 string approximately ~ 500kb>';
export var image2 = '<base64 string approximately ~ 500kb>';
# index.js

// JavaScript tokens
import * as colorExport from './color';
import * as imagesExport from './images';

export var color = colorExport;
export var images = imagesExport;

然后在我的 Next.js 应用程序中(也在 Create React App 中测试过)我像这样导入值:

# Home

import { color } from 'my-module'

const Home = () => (
  <h1 style={{ color: color.red }}>Hello!</h1>
)

export default Home

这很好用。但是,在 Next.js 和 Create React App 中,当我构建生产就绪站点时,my-modulecolorimages)的所有内容都包括在内,最终包大小略大于 1MB。

现在,如果我将 Home 中的 import 语句更改为:

import * as color from 'my-module/color'

那么最终包只包含我所期望的颜色值。但我不想如此具体地导入。有什么明显的我做错了吗?

【问题讨论】:

  • 我很确定它不喜欢var color = colorExport;。尝试改用export { colorExport as color }
  • 那行得通——谢谢!并且比我在下面的答案中的更改更具破坏性。

标签: javascript node.js reactjs


【解决方案1】:

重构 colorimages 以具有默认导出而不是命名导出,然后还重写 index 导入和导出的方式解决了问题。

例如

# color.js

export default {
  red: '#f00',
  yellow: '#ff0',
  blue: '#00f'
}
# index.js

export { default as color } from './color';
export { default as images } from './images';

【讨论】:

  • 在构建过程中是否省略了这些对象文字中的常量?我不认为摇树会这样做
  • 不是color.yellowcolor.blue,如果这就是你的意思。这是我必须解决的另一个问题。
  • 虽然这样做可以导入单个命名的导出并且似乎可以接受:import { image1 } from 'my-module/images'
  • 这应该不起作用,但会抛出异常。我猜你的编译器/捆绑器在这里过于宽松,无法向后兼容 commonjs 模块。
猜你喜欢
  • 2018-12-12
  • 1970-01-01
  • 2018-09-24
  • 2017-07-01
  • 2012-08-02
  • 1970-01-01
  • 2015-10-28
  • 2011-07-29
  • 2017-10-20
相关资源
最近更新 更多