Webpack - 构建没有依赖项的包

Ma *_*Kro 5 javascript reactjs webpack

我想知道是否可以使用一些 javascript 文件构建一个捆绑包,但没有依赖项?

我想要包含 React 组件的小包(在我的例子中,每个 React 组件都是由几个 React 组件构建的,例如评论组件包括评论框、列表和表单),我可以通过指定几个条目将 React 组件拆分为单独的文件webpack 中的点,但如果我有: 1. 组件注释 2. 组件新闻通讯,并且两者都需要 ReactDOM,将生成的文件将有 600kb 左右,其中我的 React 组件仅包含约 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
        })
    ]
};
Run Code Online (Sandbox Code Playgroud)

Comment.renderer.js:

import CommentBox from './../comment/commentBox';
ReactDOM.render(
    <CommentBox/>,
    document.getElementById("comment")
);
Run Code Online (Sandbox Code Playgroud)

Newsletter.renderer.js:

import Newsletter from './../newsletter/newsletter';
ReactDOM.render(
    <Newsletter/>,
    document.getElementById("newsletter")
);
Run Code Online (Sandbox Code Playgroud)

应用程序.js:

'use strict';
import React from 'react';
import ReactDOM from 'react-dom';
import client from './lib/client';
Run Code Online (Sandbox Code Playgroud)

Ana*_*hag 6

我在 webpack.config.js 中使用以下代码从包中排除外部依赖项。

module.exports = {
     ...
     ...
    externals:{
       "react": "React",
       "react-dom": "ReactDOM"
     },
     ...
     ...
}
Run Code Online (Sandbox Code Playgroud)

我从这个链接找到了这个答案


Ma *_*Kro 4

好吧,我已经设法做到这一点:

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
        })
    ]
};
Run Code Online (Sandbox Code Playgroud)

这部分:

minChunks: Infinity
Run Code Online (Sandbox Code Playgroud)

将确保捆绑包“供应商”中包含的代码不包含在任何其他捆绑包中。由于这种方法,评论和新闻通讯将只包含我的 React 组件。

  • 截至 2021 年,[Common Chunks 插件](https://webpack.js.org/plugins/commons-chunk-plugin/) 已被删除 (2认同)