获取Webpack不要捆绑文件

时间:2016-10-17 22:08:42

标签: javascript node.js reactjs typescript webpack

所以现在我正在使用原型,我们使用webpack(用于构建.tsx文件和复制.html文件)和webpack-dev-server之间的组合进行开发服务。您可以假设我们也将React和ReactDOM用作几个库依赖项。我们当前的构建输出是以下结构:

dist
    -favicon.ico
    -index.html
    -main.js
    -main.js.map // for source-mapping between tsx / js files

这会将所有模块(包括库依赖项)放在大型捆绑文件中。我希望最终结果如下:

dist
    -favicon.ico
    -index.html
    -appName.js
    -appName.min.js
    -react.js
    -react.min.js
    -reactDOM.js
    -reactDOM.min.js

我引用了index.html中的每个库以及.tsx文件中的import语句。所以我的问题是...... 我如何从webpack生成这个巨大的捆绑.js文件到单独的.js文件(包括库,而不必单独指定)? **奖励:我知道如何制作prod / dev环境标志,那么我如何缩小这些单独的文件(再次没有捆绑它们)?

当前的webpack.config:

var webpack = require("webpack"); // Assigning node package of webpack dependency to var for later utilization
var path = require("path"); // // Assigning node package of path dependency to var for later utilization

module.exports = {
    entry:  [
                "./wwwroot/app/appName.tsx", // Starting point of linking/compiling Typescript and dependencies, will need to add separate entry points in case of not deving SPA
                "./wwwroot/index.html", // Starting point of including HTML and dependencies, will need to add separate entry points in case of not deving SPA
                "./wwwroot/favicon.ico" // Input location for favicon
            ],
    output: {
        path: "./dist/", // Where we want to host files in local file directory structure
        publicPath: "/", // Where we want files to appear in hosting (eventual resolution to: https://localhost:4444/)
        filename: "appName.js" // What we want end compiled app JS file to be called
    },

    // Enable sourcemaps for debugging webpack's output.
    devtool: "source-map",

    devServer: {
        contentBase: './dist', // Copy and serve files from dist folder
        port: 4444, // Host on localhost port 4444
        // https: true, // Enable self-signed https/ssl cert debugging
        colors: true // Enable color-coding for debugging (VS Code does not currently emit colors, so none will be present there)
    },

    resolve: {
        // Add '.ts' and '.tsx' as resolvable extensions.
        extensions: [
            "",
            ".ico",
            ".js",
            ".ts",
            ".tsx",
            ".web.js",
            ".webpack.js"
        ]
    },

    module: {
        loaders: [
            // This loader copies the index.html file & favicon.ico to the output directory.
            {
                test: /\.(html|ico)$/,
                loader: 'file?name=[name].[ext]'
            },
            // All files with a '.ts' or '.tsx' extension will be handled by 'ts-loader'.
            {
                test: /\.tsx?$/,
                loaders: ["ts-loader"]
            }
        ],

        preLoaders: [
            // All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
            {
                test: /\.js$/,
                loader: "source-map-loader"
            }
        ]
    },

    // When importing a module whose path matches one of the following, just
    // assume a corresponding global variable exists and use that instead.
    // This is important because it allows us to avoid bundling all of our
    // dependencies, which allows browsers to cache those libraries between builds.
    // externals: {
    //     "react": "React",
    //     "react-dom": "ReactDOM",
    //     "redux": "Redux"
    // }
};

更新: 最终找到了符合我需求的解决方案,但是,再次以webpack-y的方式,需要一些额外的配置。仍然希望让它更具动感,但会在以后的时间点完善它。我一直在寻找的解决方案是能够实现" chunk"常见的模块,但我说它是文件名给出的"条目" -points在webpack中提供。我并不介意将一些文件合并在一起,这是有意义的,但是由于项目不是SPA(单页应用程序),因此希望整个文件处于组件级别。

附加代码最终成为:

plugins: [
    new webpack.optimize.CommonsChunkPlugin({ // This plugin is for extracting and created "chunks" (extracted parts of the code that are common and aren't page specific)
        // One of these instances of plugins needs to be specified for EACH chunk file output desired
        filename: "common.js", // Filename for this particular set of chunks to be stored
        name: "common", // Entry point name given for where to pull all of the chunks
        minChunks: 3 // Minimum number of chunks to be created
    })
]

我还必须通过变量名参数化入口点(例如见下文),以便我可以将react,react-dom和redux模块分配给common.js文件。

entry:  {
    main:    "./wwwroot/app/appName.tsx", // Starting point of linking/compiling Typescript and dependencies, will need to add separate entry points in case of not deving SPA
    index:   "./wwwroot/index.html", // Starting point of including HTML and dependencies, will need to add separate entry points in case of not deving SPA
    favicon: "./wwwroot/favicon.ico", // Input location for favicon
    common:  [ "react", "react-dom", "redux" ] // All of the "chunks" to extract and place in common file for faster loading of common libraries between pages
},

4 个答案:

答案 0 :(得分:10)

output设置更改为名称驱动,例如

    entry: {
        dash: 'app/dash.ts',
        home: 'app/home.ts',
    },
    output: {
        path: './public',
        filename: 'build/[name].js',
        sourceMapFilename: 'build/[name].js.map'
    },

答案 1 :(得分:1)

要扩展@basarat的答案,可以使用节点标准库中的glob包来构建“ entry”配置:

const glob = require("glob");

module.exports = [
  {
    target: "node",
    entry: glob.sync("./src/**/*.test.{ts,tsx}").reduce((acc, file) => {
      acc[file.replace(/^\.\/src\//, "")] = file;
      return acc;
    }, {}),
    output: {
      filename: "[name].js",
      chunkFilename: "[name]-[id].js",
      path: __dirname + "/dist"
    },
    //...
  }
];

这将生成与源文件同名的文件,将.ts.tsx替换为.js

答案 2 :(得分:0)

OP答案从问题中复制出来

最终找到了适合我需求的解决方案,尽管再次以这种webpack-y的方式需要一些额外的配置。仍然希望使其更具动态性,但是稍后会完善它。我正在寻找的解决方案是“压缩”通用模块的能力,但我将其表示为webpack中提供的“入口”点的文件名。我不介意合并某些文件,但在合理的情况下,但由于该项目不是SPA(单页应用程序),因此希望整体文件处于组件级。

最终的附加代码是:

plugins: [
    new webpack.optimize.CommonsChunkPlugin({ // This plugin is for extracting and created "chunks" (extracted parts of the code that are common and aren't page specific)
        // One of these instances of plugins needs to be specified for EACH chunk file output desired
        filename: "common.js", // Filename for this particular set of chunks to be stored
        name: "common", // Entry point name given for where to pull all of the chunks
        minChunks: 3 // Minimum number of chunks to be created
    })
]

我还必须通过变量名对入口点进行参数化(例如,参见下文),以便可以将react,react-dom和redux模块分配给common.js文件。

entry:  {
    main:    "./wwwroot/app/appName.tsx", // Starting point of linking/compiling Typescript and dependencies, will need to add separate entry points in case of not deving SPA
    index:   "./wwwroot/index.html", // Starting point of including HTML and dependencies, will need to add separate entry points in case of not deving SPA
    favicon: "./wwwroot/favicon.ico", // Input location for favicon
    common:  [ "react", "react-dom", "redux" ] // All of the "chunks" to extract and place in common file for faster loading of common libraries between pages
},

答案 3 :(得分:-1)

模块捆绑器替换模块加载器。

但是,与模块加载器相比,模块捆绑器在构建时运行

所以你可以在开发时使用模块加载器而不是模块捆绑器:)!