我最近看到一个关于模块深度要求的建议 -
注意:如果您不想要基于ReactART的组件及其依赖项,请执行深度要求:从'react-native-progress/Bar'中导入ProgressBar;.
根据我的知识 - 没有添加/配置Webpack 2与树摇动和自己启用uglify - RN捆绑器不会树摇动和删除未使用的模块.
鉴于此,如果建议的深度要求真的会导致未使用的依赖关系未被包含在最终捆绑中吗?
Webpack 有一个resolve.mainFields
配置:https : //webpack.js.org/configuration/resolve/#resolvemainfields
这允许控制应将哪个 package.json 字段用作入口点。
我有一个应用程序可以包含数十个不同的 3rd 方软件包。用例是我想根据包的名称指定要使用的字段。例子:
foo
使用main
字段node_modules/foo/package.json
bar
使用module
字段node_modules/bar/package.json
我依赖的某些包没有以正确的方式捆绑,该module
字段指向的代码不遵循这些规则:https : //github.com/dherman/defense-of-dot-js/blob/master /proposal.md如果我将 webpack 配置批量更改为:
resolve: {
mainFields: ['module']
}
Run Code Online (Sandbox Code Playgroud)
将mainFields
必须被设置为main
当前获取应用程序工作。这导致它总是拉入每个依赖项的 CommonJS 版本,而错过了 treeshaking。希望做这样的事情:
resolve: {
foo: {
mainFields: ['main']
},
bar: {
mainFields: ['module'],
}
Run Code Online (Sandbox Code Playgroud)
包foo
被通过其绑定到我的应用main
领域,封装bar
被通过其捆绑在module
现场。我意识到使用bar
包进行 treeshaking 的好处,并且我不会使用foo
包破坏应用程序(具有不正确的模块语法的模块字段)。
我们有一个带有用于 web 包的 react-native-web 的 react native 应用程序。问题是 react-native-web 包在最终包中是 827kb 并且是构建的主要部分。
我们没有使用包中的所有模块,但未使用的模块没有经过 treeshaken。任何减少捆绑包大小的提示?
规则
{
test: /\.(js|jsx|ts|tsx)$/,
loader: 'babel-loader',
options: {
cacheDirectory: true,
plugins: ['react-native-web']
},
exclude: /node_modules/
},
Run Code Online (Sandbox Code Playgroud)
产品配置:
module.exports = merge(baseConfig, {
mode: 'production',
plugins: [new TerserPlugin()]
})
Run Code Online (Sandbox Code Playgroud) 如果之前有人问过这个问题,我必须道歉,但我无法在网上或在与 tree shake 相关的 webpack 文档中找到答案。
树摇动如何使用默认参数进行工作?对于上下文:我特别关心 tree-shaking 的 webpack 实现如何处理默认参数。
给出以下假设的应用程序结构:
/
|_ dependency/
| |
| |_ dependency.js
| |_ moderatelyLargeFile.js
|
|
|_src/
|
|_ application.js
|_ someSmallFile.js
Run Code Online (Sandbox Code Playgroud)
以及每个文件中的以下代码:
dependency.js
import moderatelyLargeFile from './moderatelyLargeFile.js';
import { someParsingFunction1, someParsingFunction2 } from 'somewhere-else-dependency';
export default function parseSomeFile(file = moderatelylargeFile) {
let parsedResult = { ...someParsingFunction1(file), ...someParsingFunction2(file) };
return parsedResult;
}
Run Code Online (Sandbox Code Playgroud)
application.js
import parseSomeFile from './dependency/dependency.js';
import someSmallFile from './someSmallFile.js'
let result = parseSomeFile(someSmallFile);
// Do other application stuff with …
Run Code Online (Sandbox Code Playgroud) 我正在学习一些有关捆绑的知识,因为我正在努力更新一个使用Rollup的小型内部React组件库。
当前状态
现在,所有组件都被捆绑到一个index.js
文件中。每当我导入一个或多个...
import { Button, Input } from 'my-library';
Run Code Online (Sandbox Code Playgroud)
...整个库正在导入。我想解决这个问题。
此时,我已经更新了汇总以创建命名的组件文件,因此可以执行如下导入:
import Button from 'my-library/Button';
Run Code Online (Sandbox Code Playgroud)
当我只使用一个组件时,这很好,但是每当我需要一个以上组件时,例如必须从同一库中导入五行,就会感到多余。但是,每当我再次尝试对其进行分解时,整个库都将被导入。
目标
我希望能够从上面运行相同的经过结构分解的import语句,但只能导入这两个组件。
rollup.config
export default {
experimentalCodeSplitting: true,
input: [
'src/index.js',
'src/components/Button/Button.js',
'src/components/Input/Input.js',
],
output: {
exports: 'named',
dir: 'dist/',
format: 'cjs',
chunkFileNames: 'chunks/[name]-[hash].js',
},
plugins: [
external(),
babel({ exclude: 'node_modules/**', plugins: ['external-helpers'] }),
resolve(),
commonjs(),
],
};
Run Code Online (Sandbox Code Playgroud)
index.js
import Button from './components/Button/Button';
import Input from './components/Input/Input';
exports.Button = Button;
exports.Input = Input;
Run Code Online (Sandbox Code Playgroud)
因此,这将产生两个文件,Button.js
并Input.js
为每个组件构建了一个很棒的文件。但是是否有可能在一条import …
javascript rollup bundling-and-minification reactjs tree-shaking
我想知道,以下两个选项之一是在webpack中更好地进行Tree Shaking的正确方法:
import { someFeature } from 'someModule' // Option 1
import { isEmpty } from 'lodash' // Example 1
Run Code Online (Sandbox Code Playgroud)
或者,
import someFeature from 'someModule/someFeature' // Option 2
import isEmpty from 'lodash/isEmpty' // Example 2
Run Code Online (Sandbox Code Playgroud) 我已经使用 Vue CLI 3 创建了一个应用程序,我一直在观察构建过程,它警告我有大文件:
$ vue-cli-service build --modern --mode production --dest dist --target app --dashboard
- Building legacy bundle for production...
WARNING Compiled with 2 warnings12:40:54 PM
warning
asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).
This can impact web performance.
Assets:
js/chunk-vendors-legacy.443e5f8f.js (1.44 MiB)
warning
entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.
Entrypoints:
app (1.46 MiB)
js/chunk-vendors-legacy.443e5f8f.js
js/app-legacy.4b3e4352.js
Run Code Online (Sandbox Code Playgroud)
我不知道如何减少这个文件的大小,它完全来自外部库:
我以为它无法摆脱。就在今天,我在 …
我的 TypeScript 枚举是这样定义的,如以下文件所示:
\nexport enum HueColors {\n "red" = "hsl(0, 100%, 50%)",\n "orange" = "hsl(30, 100%, 50%)",\n // ...\n "pink" = "hsl(330, 100%, 50%)",\n}\n\nexport enum RGBExtended { /* ... */ }\nexport enum WebSafe { /* ... */ }\n
Run Code Online (Sandbox Code Playgroud)\nexport enum HueColors {\n "red" = "hsl(0, 100%, 50%)",\n "orange" = "hsl(30, 100%, 50%)",\n // ...\n "pink" = "hsl(330, 100%, 50%)",\n}\n\nexport enum RGBExtended { /* ... */ }\nexport enum WebSafe { /* ... */ }\n
Run Code Online (Sandbox Code Playgroud)\n … 我正在使用 TypeScript 和 OpenTelemetry 构建一个可重用的遥测库。我正在尝试了解如何实现树摇动,以便消费者可以仅导入他们需要的模块而不是所有内容,这样他们就可以减少整体包的大小。项目结构如下所示,
lib
|
|__ trace
| |____ TraceClass.ts
| |____ index.ts
|
|__ metrics
| |____ MetricClass.ts
| |____ index.ts
|
|__ logs
| |____ LogClass.ts
| |____ index.ts
|
|__ index.ts
Run Code Online (Sandbox Code Playgroud)
我将三个主要模块“trace”、“log”和“metrics”作为单独的文件夹。正如您所看到的,每个模块都有自己的“index.ts”文件,并且有一个根“index.ts”文件。假设根“index.ts”文件是否导出子模块等所有内容。
根索引.ts
export * from './trace';
export * from './metrics';
export * from './logs';
Run Code Online (Sandbox Code Playgroud)
假设消费者TraceClass
从根文件导入,如下所示,
import { TraceClass } from 'mytelemetrylib';
Run Code Online (Sandbox Code Playgroud)
上面的代码是否导入了其代码中的所有模块?
或者他们必须做这样的事情?
import { TraceClass } from 'mytelemetrylib/trace';
Run Code Online (Sandbox Code Playgroud) tree-shaking ×10
webpack ×8
javascript ×4
reactjs ×3
react-native ×2
typescript ×2
babeljs ×1
ecmascript-6 ×1
enums ×1
es6-modules ×1
performance ×1
rollup ×1
vue.js ×1
webpack-4 ×1