Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

How to bundle all js, css and images files as one file using react-scripts? #3365

Closed
willowTank opened this issue Oct 31, 2017 · 12 comments
Closed

Comments

@willowTank
Copy link

Dear Sir!
I would like to bundle all assets files as one js file.
I am using react-scripts.
Please help me.
best Regards

@Timer
Copy link
Contributor

Timer commented Oct 31, 2017

Unfortunately, we do not allow tuning like this -- you'd need to eject.

What specific use case are you trying to accomplish?

@willowTank
Copy link
Author

Thanks for your reply. I want all assets files are combined as one file.

@Timer
Copy link
Contributor

Timer commented Oct 31, 2017

Yes, but for what reason? Why do you have this requirement?

Also, if you eject you can configure all assets to go through file-loader instead of url-loader, & disable extract css plugin.

@gaearon
Copy link
Contributor

gaearon commented Nov 3, 2017

What do you mean when you say “one file”? Which particular assets do you want to see combined and why?

@samueledirito
Copy link

Sorry to reopen this old thread, but I have the same question.
Has anything changed? Do I still need ejecting the app to have it all in one bundle.js file?

I'd like to use Zalando's Tailor to move into microfrontend world. This lib requests to serve a single file with js and css all together.

Thank you ;)

@msurdi
Copy link

msurdi commented Mar 27, 2018

I've finally worked around this problem, without the need to eject, by just creating a webpack.config.js file at the root of my project with:

const path = require("path")
const UglifyJsPlugin = require("uglifyjs-webpack-plugin")
const glob = require("glob")

module.exports = {
  entry: {
    "bundle.js": glob.sync("build/static/?(js|css)/main.*.?(js|css)").map(f => path.resolve(__dirname, f)),
  },
  output: {
    filename: "build/static/js/bundle.min.js",
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
      },
    ],
  },
  plugins: [new UglifyJsPlugin()],
}

And adapting the build script in my package.json file like:

...
    "build": "npm run build:react && npm run build:bundle", 
    "build:react": "react-scripts build", 
    "build:bundle": "webpack --config webpack.config.js", 
...

Hope this helps others.

@samueledirito
Copy link

samueledirito commented Mar 27, 2018 via email

@mreliopez
Copy link

@msurdi good sir, you're a life saver

@xyklex
Copy link

xyklex commented Sep 10, 2018

Just to give an use case for this is that I would like to use Cloudfront signed url to deliver access to just one file (index.html) and without the need to request others access, because that will require that I create a signed url for each one, or without using signed cookies, because right now API gateway does not allow to return multiple Set-Cookie headers.

@AlBannaTechno
Copy link

Thanks
and for the best case we will need just one bundle.js file
when we use electron

@robertclarkson
Copy link

I've finally worked around this problem, without the need to eject, by just creating a webpack.config.js file at the root of my project with:

const path = require("path")
const UglifyJsPlugin = require("uglifyjs-webpack-plugin")
const glob = require("glob")

module.exports = {
  entry: {
    "bundle.js": glob.sync("build/static/?(js|css)/main.*.?(js|css)").map(f => path.resolve(__dirname, f)),
  },
  output: {
    filename: "build/static/js/bundle.min.js",
  },
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"],
      },
    ],
  },
  plugins: [new UglifyJsPlugin()],
}

And adapting the build script in my package.json file like:

...
    "build": "npm run build:react && npm run build:bundle", 
    "build:react": "react-scripts build", 
    "build:bundle": "webpack --config webpack.config.js", 
...

Hope this helps others.

This was great but my app was not bundling correctly as there were 3 JS files that had to be bundled, not just main.hash.chunk.js

I just had to tweak the webpack config to include all files:

entry: {
    "bundle.js": glob.sync("build/static/?(js|css)/*.?(js|css)").map(f => path.resolve(__dirname, f)),
  },

@npomfret
Copy link

npomfret commented Jan 3, 2019

Is there a way to inline everything (all css and js) into a single html file?

@lock lock bot locked and limited conversation to collaborators Jan 8, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

10 participants