- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的目标是在我的 webpack.prod.js
中摇树 lodash
(以及其他)。这是我的配置文件。为了完整起见,我还将包含 webpack.dev.js
、webpack.common.js
、tsconfig.json
和 包。 json
:
webpack.common.js
:
const path = require('path');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
module: {
rules: [
{
test: /\.(png|svg|jpg|gif|obj)$/,
use: [
'file-loader'
]
},
{
test: /\.glsl$/,
loader: 'webpack-glsl-loader'
},
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/
},
{
test: /\.ts$/,
enforce: 'pre',
loader: 'tslint-loader',
options: { failOnHint: true }
}
]
},
resolve: {
extensions: [".tsx", ".ts", ".js"]
},
entry: {
app: './src/index.ts'
},
plugins: [
new CleanWebpackPlugin(['dist']),
new HtmlWebpackPlugin({
title: 'Production'
})
],
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'dist')
}
};
webpack.dev.js
:
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const JarvisPlugin = require("webpack-jarvis");
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
module.exports = {
module: {
rules: [
{
test: /\.(png|svg|jpg|gif|obj)$/,
use: [
'file-loader'
]
},
{
test: /\.glsl$/,
loader: 'webpack-glsl-loader'
},
{
test: /\.tsx?$/,
use: 'ts-loader',
exclude: /node_modules/
},
{
test: /\.ts$/,
enforce: 'pre',
loader: 'tslint-loader',
options: { failOnHint: true }
}
]
},
resolve: {
extensions: [".tsx", ".ts", ".js"]
},
entry: {
app: './src/index.ts'
},
devtool: 'inline-source-map',
devServer: {
contentBase: './dist'
},
plugins: [
new HtmlWebpackPlugin({ title: 'urknall-core dev' }),
new BundleAnalyzerPlugin({ analyzerPort: 8888 }),
new JarvisPlugin({ port: 1337 }),
],
output: {
filename: '[name].bundle.js',
publicPath: '/'
}
};
webpack.prod.js
:
const webpack = require('webpack');
const merge = require('webpack-merge');
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
const common = require('./webpack.common.js');
module.exports = merge(common, {
devtool: 'source-map',
plugins: [
new UglifyJSPlugin({
sourceMap: true,
test: /\.js($|\?)/i,
uglifyOptions: {
compress: true
}
}),
new webpack.LoaderOptionsPlugin({
minimize: true,
debug: false
}),
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
}),
]
});
tsconfig.json
:
{
"compilerOptions": {
"outDir": "./dist/",
"declaration": true,
"declarationDir": "./types",
"sourceMap": true,
"noImplicitAny": true,
"module": "commonjs",
"target": "es6",
}
}
package.json
:
{
"name": "bla",
"version": "0.0.1",
"description": "",
"main": "index.ts",
"types": "./dist/types/",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack --config webpack.prod.js",
"start": "webpack-dev-server --open --config webpack.dev.js",
"watch": "webpack --watch"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"@types/gl-matrix": "^2.4.0",
"@types/lodash": "^4.14.104",
"@types/node": "^8.9.4",
"@types/webgl2": "^0.0.2",
"@types/webpack-dev-middleware": "^1.12.3",
"clean-webpack-plugin": "^0.1.18",
"file-loader": "^0.11.2",
"html-webpack-plugin": "^2.30.1",
"image-webpack-loader": "^3.6.0",
"style-loader": "^0.18.2",
"ts-loader": "^2.3.7",
"ts-node": "^3.3.0",
"tslint": "^5.9.1",
"tslint-loader": "^3.5.3",
"typescript": "^2.7.1",
"uglifyjs-webpack-plugin": "^1.2.2",
"webpack": "^3.11.0",
"webpack-bundle-analyzer": "^2.11.0",
"webpack-dev-middleware": "^1.12.0",
"webpack-dev-server": "^2.11.2",
"webpack-glsl-loader": "^1.0.1",
"webpack-jarvis": "^0.3.0",
"webpack-merge": "^4.1.2"
},
"dependencies": {
"gl-matrix": "^2.4.0",
"lodash-es": "^4.17.5"
}
}
使用此配置,app.bundle.js
生成一个 507 KB 的文件,而 app.bundle.js.map
为 1.6 MB。如果我不丑化构建输出,我可以看到整个 lodash 库都被写入了文件。我还看到了一些其他函数,例如 gl-matrix
被写入文件,尽管我什至没有使用它们。
我还在开发中运行了一个 webpack-bundle-analyzer
并且输出与生产没有区别。由于缩小,只有 budle 文件约为 1.4 MB 而不是 1.6 MB。
我在整个项目中只加载了两次lodash
,比如:
从 'lodash' 导入 { some, find, cloneDeep };
不再使用 lodash
函数。为什么 Webpack
会膨胀我的 app.bundle.js
?
我的配置有问题吗?
最佳答案
鉴于标准 lodash
包的现有导出样式,您有两种选择来解决此问题:
更新您的导入以处理标准 lodash
包使用的导出。如果你看lodash's npm page您可以看到它们支持从路径中挑选特定方法。
import some from 'lodash/fp/some';
import find from 'lodash/fp/find';
import cloneDeep from 'lodash/fp/cloneDeep';
关于typescript - 无法在 Webpack、TypeScript 项目中摇晃 lodash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49036745/
我已经写了并且 npm 发布了这个:https://github.com/justin-calleja/pkg-dependents 现在我正在用 Typescript 编写这个包:https://g
我有一个函数,我想在 TypeScript 中模拟它以进行测试。在我的测试中,我只关心 json和 status .但是,当使用 Jest 的 jest.spyOn 时我的模拟函数的类型设置为返回 h
我正在使用一个库 (Axios),它的包中包含 Typescript 声明。 我想声明一个将 AxiosResponse(在库的 .d.ts 文件中声明)作为参数的函数。我有以下内容: functio
我是 Typescript 的新手。我想使用 将一个 Typescript 文件加载到另一个 Typescript 文件中标签。 我做了一些事情,但它不起作用!请帮助我。 first.ts: imp
为什么我会收到下面屏幕截图中显示的错误? Atom 说我的 tsconfig.json“项目文件包含无效选项”用于 allowJs、buildOnSave 和 compileOnSave。 但是应该允
所以我正在创建一个 TypeScript 库,我可以轻松地将所有生成的 JS 文件编译成一个文件。有没有办法将所有 .ts 和 .d.ts 编译成一个 .ts 文件? 除了支持 JS 的版本(较少的智
Microsoft Research 提供了一种名为Safer TypeScript 的新 TypeScript 编译器变体: http://research.microsoft.com/en-us/
我需要这个来在单个文件中分发 TypeScript 中的库。有没有办法将多个 typescript 文件合并到(一个js文件+一个 typescript 定义)文件中? 最佳答案 要创建一个库,您可以
用例:我想知道一个函数在 typescript 中执行需要多少时间。我想为此目的使用装饰器。我希望装饰器应该返回时间以便(我可以进一步使用它),而不仅仅是打印它。 例如: export functio
我想检查一个类型是否可以为 null,以及它是否具有值的条件类型。 我尝试实现 type IsNullable = T extends null ? true : false; 但是好像不行 type
我的问题是基于这个 question and answer 假设我们有下一个代码: const myFn = (p: { a: (n: number) => T, b: (o: T) => v
我知道双重否定前缀,我知道 TypeScript 的单后缀(非空断言)。 但是这个双后缀感叹号是什么? /.*验证码为(\d{6}).*/.exec(email.body!!)!![1] 取自here
我正在使用以下文件结构在 Webstorm 中开发一个项目 | src | ... | many files | types | SomeInterface |
在 TypeScript 类中,可以为属性声明类型,例如: class className { property: string; }; 如何在对象字面量中声明属性的类型? 我试过下面的代码,但它
我正在寻找一种在不丢失推断类型信息的情况下将 TypeScript 中的文字值限制为特定类型的好方法。 让我们考虑一个类型Named,它保证有一个名字。 type Named = { name:
在 TypeScript 中,我想创建一个联合类型来表示属于一个或多个不同类型的值,类似于 oneOf在 OpenAPI或 JSON Schema .根据a previous answer on a
type Func = (foo:string) => void // function expression const myFunctionExpression:Func = function(f
假设我有一个联合类型,我正在使用类似 reducer 的 API 调用模式,看起来像这样: type Action = { request: { action: "create
我在 typescript 中有以下去抖功能: export function debounce( callback: (...args: any[]) => void, wait: numb
在 Vue3 的 defineComponent 函数中,第一个泛型参数是 Props,所以我在这里使用 Typescript 接口(interface)提供我的 props 类型。喜欢: expor
我是一名优秀的程序员,十分优秀!