Webpack - 构建无依赖包
Webpack - build bundle without dependencies
我想知道是否可以用一些 javascript 文件构建一个没有依赖关系的包?
我想要包含 React 组件的小包(在我的案例中,每个 React 组件都是由几个 React 组件构建的,例如评论组件包括评论框、列表和表单),
我可以通过在 webpack 中指定几个入口点将 React 组件拆分为单独的文件,但如果我有:
1.组件注释
2. 组件通讯
并且它们都需要 ReactDOM,将生成的文件将有 600kb,其中我的反应组件仅包含 ~100 行 js 代码。
我想要另外一个文件,其中将包含来自“require('react-dom') 的所有代码,而那两个文件将只包含 React 组件代码。这可能吗?
我当前的设置:
'use strict';
import path from 'path';
import CommonsChunkPlugin from "webpack/lib/optimize/CommonsChunkPlugin";
module.exports = {
entry: {
app: "./app.js",
newsletter: "./components/renderers/newsletter.renderer.js",
comment: "./components/renderers/comment.renderer.js"
},
output: {
path: path.join(__dirname),
filename: "built/[name].entry.js"
},
devtool: 'sourcemaps',
cache: true,
debug: true,
module: {
loaders: [
{
test: /\.jsx?$/,
exclude: [/(node_modules)/],
loader: 'babel'
}
],
resolve: {
extensions: ['', '.js', '.jsx']
}
},
plugins: [
new CommonsChunkPlugin({
name: "comment.js",
chunks: ["comment", "app"],
minChunks: 2
}),
new CommonsChunkPlugin({
name: "newsletter.js",
chunks: ["newsletter", "app"],
minChunks: 2
})
]
};
Comment.renderer.js:
import CommentBox from './../comment/commentBox';
ReactDOM.render(
<CommentBox/>,
document.getElementById("comment")
);
Newsletter.renderer.js:
import Newsletter from './../newsletter/newsletter';
ReactDOM.render(
<Newsletter/>,
document.getElementById("newsletter")
);
app.js:
'use strict';
import React from 'react';
import ReactDOM from 'react-dom';
import client from './lib/client';
好的,我已经设法做到了:
import path from 'path';
import CommonsChunkPlugin from "webpack/lib/optimize/CommonsChunkPlugin";
module.exports = {
entry: {
vendor: ["react","react-dom", "underscore"],
comment: "./components/renderers/comment.renderer.js",
newsletter: "./components/renderers/newsletter.renderer.js"
},
output: {
path: path.join(__dirname),
filename: "built/[name].bundle.js"
},
devtool: 'sourcemaps',
cache: true,
debug: true,
module: {
loaders: [
{
test: /\.jsx?$/,
exclude: [/(node_modules)/],
loader: 'babel'
}
],
resolve: {
extensions: ['', '.js', '.jsx']
}
},
plugins: [
new CommonsChunkPlugin({
name: "vendor",
minChunks: Infinity
})
]
};
这部分:
minChunks: Infinity
将确保包 "vendor" 中包含的代码不包含在任何其他包中。多亏了这种方法,评论和时事通讯将只包含我的 React 组件。
我在 webpack.config.js 中使用以下代码从包中排除外部依赖项。
module.exports = {
...
...
externals:{
"react": "React",
"react-dom": "ReactDOM"
},
...
...
}
我从 this link
找到了这个答案
为了补充@AnandShanbhag 的回答,您可以从 package.json
中获取所有依赖项并使用函数将它们转换为外部:
module.exports = {
...
// put everything inside package.json dependencies as externals
externals: Object.keys(require('./package.json').dependencies)
.reduce(
function (acc, cur) {
acc[cur] = cur
return acc
},
new Object()
),
...
}
我想知道是否可以用一些 javascript 文件构建一个没有依赖关系的包?
我想要包含 React 组件的小包(在我的案例中,每个 React 组件都是由几个 React 组件构建的,例如评论组件包括评论框、列表和表单), 我可以通过在 webpack 中指定几个入口点将 React 组件拆分为单独的文件,但如果我有: 1.组件注释 2. 组件通讯 并且它们都需要 ReactDOM,将生成的文件将有 600kb,其中我的反应组件仅包含 ~100 行 js 代码。
我想要另外一个文件,其中将包含来自“require('react-dom') 的所有代码,而那两个文件将只包含 React 组件代码。这可能吗?
我当前的设置:
'use strict';
import path from 'path';
import CommonsChunkPlugin from "webpack/lib/optimize/CommonsChunkPlugin";
module.exports = {
entry: {
app: "./app.js",
newsletter: "./components/renderers/newsletter.renderer.js",
comment: "./components/renderers/comment.renderer.js"
},
output: {
path: path.join(__dirname),
filename: "built/[name].entry.js"
},
devtool: 'sourcemaps',
cache: true,
debug: true,
module: {
loaders: [
{
test: /\.jsx?$/,
exclude: [/(node_modules)/],
loader: 'babel'
}
],
resolve: {
extensions: ['', '.js', '.jsx']
}
},
plugins: [
new CommonsChunkPlugin({
name: "comment.js",
chunks: ["comment", "app"],
minChunks: 2
}),
new CommonsChunkPlugin({
name: "newsletter.js",
chunks: ["newsletter", "app"],
minChunks: 2
})
]
};
Comment.renderer.js:
import CommentBox from './../comment/commentBox';
ReactDOM.render(
<CommentBox/>,
document.getElementById("comment")
);
Newsletter.renderer.js:
import Newsletter from './../newsletter/newsletter';
ReactDOM.render(
<Newsletter/>,
document.getElementById("newsletter")
);
app.js:
'use strict';
import React from 'react';
import ReactDOM from 'react-dom';
import client from './lib/client';
好的,我已经设法做到了:
import path from 'path';
import CommonsChunkPlugin from "webpack/lib/optimize/CommonsChunkPlugin";
module.exports = {
entry: {
vendor: ["react","react-dom", "underscore"],
comment: "./components/renderers/comment.renderer.js",
newsletter: "./components/renderers/newsletter.renderer.js"
},
output: {
path: path.join(__dirname),
filename: "built/[name].bundle.js"
},
devtool: 'sourcemaps',
cache: true,
debug: true,
module: {
loaders: [
{
test: /\.jsx?$/,
exclude: [/(node_modules)/],
loader: 'babel'
}
],
resolve: {
extensions: ['', '.js', '.jsx']
}
},
plugins: [
new CommonsChunkPlugin({
name: "vendor",
minChunks: Infinity
})
]
};
这部分:
minChunks: Infinity
将确保包 "vendor" 中包含的代码不包含在任何其他包中。多亏了这种方法,评论和时事通讯将只包含我的 React 组件。
我在 webpack.config.js 中使用以下代码从包中排除外部依赖项。
module.exports = {
...
...
externals:{
"react": "React",
"react-dom": "ReactDOM"
},
...
...
}
我从 this link
找到了这个答案为了补充@AnandShanbhag 的回答,您可以从 package.json
中获取所有依赖项并使用函数将它们转换为外部:
module.exports = {
...
// put everything inside package.json dependencies as externals
externals: Object.keys(require('./package.json').dependencies)
.reduce(
function (acc, cur) {
acc[cur] = cur
return acc
},
new Object()
),
...
}