- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试升级到 webpack 4,但在生产模式下出现以下错误:
webpack.optimize.UglifyJsPlugin has been removed, please use config.optimization.minimize instead.`
我删除了 UglifyJsPlugin,但仍然出现相同的错误。我还尝试将此代码块添加到我的配置中:
optimization: {
minimizer: [
new UglifyJsPlugin({
cache: true,
parallel: true,
sourceMap: true,
}),
],
}
这并没有修复错误。
我的 webpack.production.config.json 看起来像这样:
{
entry: [appIndexJs],
output: {
path: appBuild,
publicPath: '/',
filename: '[name].[chunkhash].js',
chunkFilename: '[name].[chunkhash].chunk.js',
},
module: {
rules: [
{
test: /\.jsx?$/,
use: {
loader: 'babel-loader',
},
include: appSrc,
},
{
test: /\.css$/,
exclude: /node_modules/,
use: ['style-loader', 'css-loader'],
},
{
test: /\.css$/,
include: /node_modules/,
use: ['style-loader', 'css-loader'],
},
{
test: /\.(eot|svg|otf|ttf|woff|woff2)$/,
use: 'file-loader',
},
{
test: /\.(jpg|png|gif)$/,
use: [
'file-loader',
{
loader: 'image-webpack-loader',
options: {
progressive: true,
optimizationLevel: 7,
interlaced: false,
pngquant: {
quality: '65-90',
speed: 4,
},
},
},
],
},
{
test: /\.html$/,
use: 'html-loader',
},
{
test: /\.md/,
use: [
'html-loader',
'markdown-loader',
],
},
{
test: /\.(mp4|webm)$/,
use: {
loader: 'url-loader',
options: {
limit: 10000,
},
},
},
],
},
plugins: [
new webpack.ProvidePlugin({
fetch: 'exports-loader?self.fetch!whatwg-fetch',
}),
new webpack.optimize.ModuleConcatenationPlugin(),
new HtmlWebpackPlugin({
template: 'src/index.html',
minify: {
removeComments: true,
collapseWhitespace: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
removeStyleLinkTypeAttributes: true,
keepClosingSlash: true,
minifyJS: true,
minifyCSS: true,
minifyURLs: true,
},
inject: true,
}),
new OfflinePlugin({
relativePaths: false,
publicPath: '/',
excludes: ['.htaccess'],
caches: {
main: [':rest:'],
},
safeToUseOptionalCaches: true,
AppCache: false,
}),
],
resolve: {
extensions: [
'.js',
'.jsx',
'.react.js',
],
alias: {
styles,
},
},
mode: 'production',
bail: true,
}
感谢您的帮助:)
更新:我的 package.json 文件:
{
"name": "react-start",
"version": "1.0.0",
"description": "Easy starter kit for creating react apps.",
"main": "index.js",
"repository": {
"type": "git",
"url": "https://github.com/lItc0de/react-start.git"
},
"author": "Basti Paintner @lItcode",
"license": "MIT",
"engines": {
"node": ">=6"
},
"scripts": {
"start": "cross-env NODE_ENV=development node server",
"build": "yarn coverage && cross-env NODE_ENV=production node scripts/build.js",
"serve": "cross-env NODE_ENV=production HTTPS=true node server",
"prod": "yarn build && yarn serve",
"test": "cross-env NODE_ENV=test jest",
"test:debug": "cross-env NODE_ENV=test node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand --watchAll",
"coverage": "yarn test --coverage",
"watch": "cross-env NODE_ENV=test jest --watchAll",
"build:dll": "node scripts/buildDll.js",
"lint:eslint": "eslint --ignore-path .gitignore --ignore-pattern internals/scripts",
"lint:css": "stylelint",
"lint:staged": "lint-staged",
"storybook": "start-storybook -p 9001 -c config/storybook",
"postinstall": "yarn build:dll"
},
"lint-staged": {
"*.{js,jsx}": [
"lint:eslint",
"lint:css"
]
},
"pre-commit": "lint:staged",
"babel": {
"plugins": [
"styled-components",
"transform-decorators-legacy"
],
"presets": [
[
"env",
{
"modules": false
}
],
"react",
"stage-0",
"flow"
],
"env": {
"production": {
"only": [
"src"
],
"plugins": [
"transform-react-remove-prop-types",
"transform-react-constant-elements",
"transform-react-inline-elements"
]
},
"test": {
"plugins": [
"transform-es2015-modules-commonjs",
"dynamic-import-node"
]
}
}
},
"eslintConfig": {
"parser": "babel-eslint",
"extends": "airbnb",
"env": {
"browser": true,
"node": true,
"jest": true,
"es6": true
},
"plugins": [
"react",
"jsx-a11y",
"flowtype"
],
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
},
"rules": {
"arrow-parens": [
"error",
"always"
],
"arrow-body-style": [
2,
"as-needed"
],
"class-methods-use-this": 0,
"comma-dangle": [
2,
"always-multiline"
],
"import/imports-first": 0,
"import/newline-after-import": 0,
"import/no-dynamic-require": 0,
"import/no-extraneous-dependencies": 0,
"import/no-named-as-default": 0,
"import/no-unresolved": 2,
"import/no-webpack-loader-syntax": 0,
"import/prefer-default-export": 0,
"indent": [
"error",
2,
{
"SwitchCase": 1
}
],
"jsx-a11y/aria-props": 2,
"jsx-a11y/heading-has-content": 0,
"jsx-a11y/label-has-for": 2,
"jsx-a11y/mouse-events-have-key-events": 2,
"jsx-a11y/role-has-required-aria-props": 2,
"jsx-a11y/role-supports-aria-props": 2,
"max-len": 0,
"newline-per-chained-call": 0,
"no-confusing-arrow": 0,
"no-console": 1,
"no-use-before-define": 0,
"no-param-reassign": [
"error",
{
"props": false
}
],
"prefer-template": 2,
"react/forbid-prop-types": 0,
"react/jsx-first-prop-new-line": [
2,
"multiline"
],
"react/jsx-filename-extension": 0,
"react/jsx-no-target-blank": 0,
"react/require-default-props": 0,
"react/require-extension": 0,
"react/self-closing-comp": 0,
"require-yield": 0,
"flowtype/define-flow-type": 1,
"flowtype/use-flow-type": 1
},
"settings": {
"import/resolver": {
"webpack": {
"config": "./config/webpack/webpack.config.prod.js"
}
}
}
},
"stylelint": {
"processors": [
"stylelint-processor-styled-components"
],
"extends": [
"stylelint-config-standard",
"stylelint-config-styled-components"
],
"syntax": "scss",
"rules": {
"number-leading-zero": "never"
}
},
"jest": {
"collectCoverageFrom": [
"src/**/*.{js,jsx}",
"!src/**/*.test.{js,jsx}",
"!src/*/RbGenerated*/*.{js,jsx}",
"!src/index.js",
"!src/i18n.js",
"!src/styles/**/*.js",
"!src/*/*/Loadable.{js,jsx}"
],
"coverageThreshold": {
"global": {
"statements": 98,
"branches": 91,
"functions": 98,
"lines": 98
}
},
"moduleDirectories": [
"node_modules",
"src"
],
"moduleNameMapper": {
".*\\.(css|less|styl|scss|sass)$": "<rootDir>/config/mocks/cssModule.js",
".*\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/config/mocks/image.js",
".*\\.(md)$": "<rootDir>/config/mocks/md.mock.js",
"i18next-resource-store-loader!./locales/index": "<rootDir>src/locales/en/translation.json"
},
"setupTestFrameworkScriptFile": "<rootDir>/config/setup.tests.js",
"testRegex": "tests/.*\\.test\\.js$"
},
"dllPlugin": {
"exclude": [
"chalk",
"compression",
"cross-env",
"express",
"ip",
"minimist",
"sanitize.css"
],
"include": [
"core-js",
"lodash",
"eventsource-polyfill"
]
},
"dependencies": {
"chalk": "^2.3.0",
"colors.js": "^1.2.4",
"compression": "^1.7.1",
"eventsource-polyfill": "^0.9.6",
"express": "^4.16.2",
"fontfaceobserver": "^2.0.13",
"i18next": "^10.3.0",
"i18next-browser-languagedetector": "^2.1.0",
"ip": "^1.1.5",
"minimist": "^1.2.0",
"mobx": "^4.1.0",
"mobx-react": "^5.0.0",
"prop-types": "^15.6.0",
"react": "^16.2.0",
"react-dom": "^16.2.0",
"react-helmet": "^5.2.0",
"react-i18next": "^7.3.4",
"react-loadable": "^5.3.1",
"react-router-dom": "^4.2.2",
"sanitize.css": "^5.0.0",
"styled-components": "^3.1.6",
"whatwg-fetch": "^2.0.3"
},
"devDependencies": {
"@storybook/addon-actions": "^3.3.15",
"@storybook/addon-info": "^3.3.15",
"@storybook/addon-options": "^3.3.15",
"@storybook/addons": "^3.3.15",
"@storybook/react": "^3.3.15",
"add-asset-html-webpack-plugin": "^2.1.2",
"babel-cli": "^6.26.0",
"babel-core": "^6.26.0",
"babel-eslint": "^8.2.1",
"babel-jest": "^22.1.0",
"babel-loader": "^7.1.2",
"babel-plugin-dynamic-import-node": "^1.2.0",
"babel-plugin-styled-components": "^1.4.0",
"babel-plugin-transform-decorators-legacy": "^1.3.4",
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.0",
"babel-plugin-transform-react-constant-elements": "^6.23.0",
"babel-plugin-transform-react-inline-elements": "^6.22.0",
"babel-plugin-transform-react-remove-prop-types": "^0.4.12",
"babel-preset-env": "^1.6.1",
"babel-preset-flow": "^6.23.0",
"babel-preset-react": "^6.24.1",
"babel-preset-stage-0": "^6.24.1",
"case-sensitive-paths-webpack-plugin": "^2.1.1",
"circular-dependency-plugin": "^5.0.1",
"cross-env": "^5.1.3",
"css-loader": "^0.28.9",
"enzyme": "^3.3.0",
"enzyme-adapter-react-16": "^1.1.1",
"eslint": "^4.15.0",
"eslint-config-airbnb": "^16.1.0",
"eslint-config-airbnb-base": "^12.1.0",
"eslint-import-resolver-webpack": "^0.8.4",
"eslint-plugin-flowtype": "^2.42.0",
"eslint-plugin-import": "^2.8.0",
"eslint-plugin-jsx-a11y": "^6.0.3",
"eslint-plugin-react": "^7.5.1",
"exports-loader": "^0.7.0",
"file-loader": "^1.1.6",
"flow-bin": "^0.68.0",
"fs-extra": "^5.0.0",
"html-loader": "^0.5.5",
"html-webpack-plugin": "^3.1.0",
"i18next-resource-store-loader": "^0.1.2",
"image-webpack-loader": "^4.0.0",
"jest": "^22.1.1",
"lint-staged": "^7.0.0",
"markdown-loader": "^2.0.2",
"offline-plugin": "^4.9.0",
"pre-commit": "^1.2.2",
"react-dev-utils": "^5.0.0",
"react-test-renderer": "^16.2.0",
"request": "2.85.0",
"shelljs": "^0.8.1",
"sinon": "^4.4.2",
"style-loader": "^0.20.1",
"stylelint": "^9.0.0",
"stylelint-config-standard": "^18.0.0",
"stylelint-config-styled-components": "^0.1.1",
"stylelint-processor-styled-components": "^1.2.2",
"typescript": "^2.7.2",
"uglifyjs-webpack-plugin": "^1.2.4",
"url-loader": "^1.0.1",
"webpack": "^4.4.1",
"webpack-cli": "^2.0.13",
"webpack-dev-middleware": "^3.1.0",
"webpack-hot-middleware": "^2.21.0",
"webpack-merge": "^4.1.2"
}
}
最佳答案
你可以使用这个:
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
...
optimization: {
minimizer: [
new UglifyJsPlugin({
uglifyOptions: { ... }
})
]
}
<小时/>
还有更多选项:
module.exports = {
// ...
plugins: [
// ... other plugins
optimization: {
minimizer: [
//https://github.com/mishoo/UglifyJS2/tree/harmony
new UglifyJsPlugin({
uglifyOptions: {
output: {
comments: false
},
minify: {},
compress: {
booleans: true,
//...
}
}
}),
]
},
]
// ...
}
更多讨论: https://github.com/webpack-contrib/uglifyjs-webpack-plugin/issues/234#issuecomment-369134047
stackoverflow 中的类似问题: https://stackoverflow.com/a/49059746/6200607
在 Webpack 文档中: https://webpack.js.org/plugins/uglifyjs-webpack-plugin/
** 编辑:用 UglifyJsPlugin 替换 UglifyJSPlugin **
关于reactjs - 升级到webpack 4 UglifyJsPlugin报错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49570488/
像这样的webpack.config.js文件可以导出多个配置: module.exports = [{entry: 'a.js'}, {entry: 'b.js'}]; 当我调用 webpack 时
我正在尝试在 webpack 配置文件中设置 browserslist,但不知道如何执行此操作。 在 webpack.config 中尝试了以下内容: 'use strict'; module.exp
If you are using webpack v5 or above you do not need to install this plugin. Webpack v5 comes with t
使用webpack 2时,为什么需要以相反的顺序为“use:”键添加加载程序?为什么不从头到尾,从左到右列出每个加载器?有什么理由吗? 最佳答案 看起来像是一种约定,它很容易成为匹配执行顺序和源顺序的
当我 web pack 的时候 --watch --config webpack.production.config.js --mode production 我有这个错误: ERROR in Typ
我有一个使用 Twig 进行模板的项目。其中的所有数据都是静态的,但为了清楚起见,我已经在其他 Twig 文件中分离出部分页面(否则一个文件中会有数百行标记)。 我使用 webpack 作为构建工具,
我使用 cli 创建了一个 vue.js 项目。我使用了 webpack 模板。我已经为此工作了几天,并且工作顺利。 现在我需要向项目添加一个 npm 包。这个包建议我对 webpack 配置进行一些
我正在使用运行“node_modules/.bin/webpack”,但我知道可以配置路径以便您只需键入“webpack ”。不过,我找不到方法。 :/ 最佳答案 如果你安装一个包 globally
我正在服务器渲染我的 react 应用程序,如下所示: export default ({ clientStats }: { clientStats: any }) => async (req: Re
我试过包含一个通配符,它破坏了构建;和多个 favicon字段条目,它只使用最后一个输入。我如何支持使用此插件包含多个网站图标文件? 最佳答案 您还需要包括 favicons-webpack-pl
我正在使用 webpack 编译我的 Reactjs 文件。在我的项目中,我需要对后端进行 API 调用。 现在我有 3 个环境,分别是本地环境、开发环境和生产环境。 所以我有一个constants.
我正在将所有文件构建到“dist”文件夹中。 Dist ->index.html ->bundle.js 我已将配置设置为在我需要的特定端口上运行。 { entry: './src/ind
我想使用由 Closure Compiler 使用 Webpack 生成的 SourceMap,但我不知道该怎么做。 这是我的 webpack 配置: const ClosureCompiler =
有没有办法接收当前文件路径,就像在 requirejs 中一样? define(['module'], function (module) { console.log(module.uri)
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 4年前关闭。 Improve this questi
我是 webpack 的初学者用户。我想写一个webpack.config.js建立我的项目。但是有什么不对的地方! 这是我的 package.json (已安装所有依赖项): { "name":
我从这里开始:https://github.com/vuejs/vue-cli 我不确定它是否使用 Webpack。 包含/使用 webpack 的项目将包含哪些文件? 最佳答案 如果您的项目正在使用
Webpack,你将要了我的命。 html-webpack-plugin 在生产中运行良好。 'dist' 文件夹加载了我的 html 模板和插入的包。好酷。 但是,webpack-dev-serve
想象一下我有一个这样的项目: /moduleA/src... /moduleB/src... /mainApp/src... 每个模块和主应用程序都有一个单独的 webpack.config。模块是库
根据 webpack 文档,我尝试将 UglifyJSPlugin 添加到 webpack 4 项目中,但我仍然在我的包中看到死代码甚至注释,这让我认为我的 uglify 插件配置没有被使用。 Lin
我是一名优秀的程序员,十分优秀!