强制角度cli gz生成

时间:2017-10-02 13:35:34

标签: css angular webpack angular-cli

我试图获得一个填充了标准文件+ .gz版本的dist文件夹。我webpack.config.js获取了new CompressPlugin({})文件,因此我可以添加压缩插件value_counts。我添加了ejected: false作为最后一个插件,并在.angular-cli.json文件中标记了ng build

当我运行ng new时,我不会生成任何我期望的.gzip / .gz文件。

我有什么遗漏或做错了吗?完整的webpack文件(主要由const fs = require('fs'); const path = require('path'); const CopyWebpackPlugin = require('copy-webpack-plugin'); const ProgressPlugin = require('webpack/lib/ProgressPlugin'); const CircularDependencyPlugin = require('circular-dependency-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const autoprefixer = require('autoprefixer'); const postcssUrl = require('postcss-url'); const cssnano = require('cssnano'); const CompressionPlugin = require("compression-webpack-plugin"); const { NoEmitOnErrorsPlugin, SourceMapDevToolPlugin, NamedModulesPlugin } = require('webpack'); const { NamedLazyChunksWebpackPlugin, BaseHrefWebpackPlugin } = require('@angular/cli/plugins/webpack'); const { CommonsChunkPlugin } = require('webpack').optimize; const { AotPlugin } = require('@ngtools/webpack'); const nodeModules = path.join(process.cwd(), 'node_modules'); const realNodeModules = fs.realpathSync(nodeModules); const genDirNodeModules = path.join(process.cwd(), 'src', '$$_gendir', 'node_modules'); const entryPoints = ["inline","polyfills","sw-register","styles","vendor","main"]; const minimizeCss = false; const baseHref = ""; const deployUrl = ""; const postcssPlugins = function () { // safe settings based on: https://github.com/ben-eb/cssnano/issues/358#issuecomment-283696193 const importantCommentRe = /@preserve|@license|[@#]\s*source(?:Mapping)?URL|^!/i; const minimizeOptions = { autoprefixer: false, safe: true, mergeLonghand: false, discardComments: { remove: (comment) => !importantCommentRe.test(comment) } }; return [ postcssUrl({ url: (URL) => { // Only convert root relative URLs, which CSS-Loader won't process into require(). if (!URL.startsWith('/') || URL.startsWith('//')) { return URL; } if (deployUrl.match(/:\/\//)) { // If deployUrl contains a scheme, ignore baseHref use deployUrl as is. return `${deployUrl.replace(/\/$/, '')}${URL}`; } else if (baseHref.match(/:\/\//)) { // If baseHref contains a scheme, include it as is. return baseHref.replace(/\/$/, '') + `/${deployUrl}/${URL}`.replace(/\/\/+/g, '/'); } else { // Join together base-href, deploy-url and the original URL. // Also dedupe multiple slashes into single ones. return `/${baseHref}/${deployUrl}/${URL}`.replace(/\/\/+/g, '/'); } } }), autoprefixer(), ].concat(minimizeCss ? [cssnano(minimizeOptions)] : []); }; module.exports = { "resolve": { "extensions": [ ".ts", ".js" ], "modules": [ "./node_modules", "./node_modules" ], "symlinks": true }, "resolveLoader": { "modules": [ "./node_modules", "./node_modules" ] }, "entry": { "main": [ "./src\\main.ts" ], "polyfills": [ "./src\\polyfills.ts" ], "styles": [ "./src\\styles.css" ] }, "output": { "path": path.join(process.cwd(), "dist"), "filename": "[name].bundle.js", "chunkFilename": "[id].chunk.js" }, "module": { "rules": [ { "enforce": "pre", "test": /\.js$/, "loader": "source-map-loader", "exclude": [ /(\\|\/)node_modules(\\|\/)/ ] }, { "test": /\.html$/, "loader": "raw-loader" }, { "test": /\.(eot|svg|cur)$/, "loader": "file-loader?name=[name].[hash:20].[ext]" }, { "test": /\.(jpg|png|webp|gif|otf|ttf|woff|woff2|ani)$/, "loader": "url-loader?name=[name].[hash:20].[ext]&limit=10000" }, { "exclude": [ path.join(process.cwd(), "src\\styles.css") ], "test": /\.css$/, "use": [ "exports-loader?module.exports.toString()", { "loader": "css-loader", "options": { "sourceMap": false, "importLoaders": 1 } }, { "loader": "postcss-loader", "options": { "ident": "postcss", "plugins": postcssPlugins } } ] }, { "exclude": [ path.join(process.cwd(), "src\\styles.css") ], "test": /\.scss$|\.sass$/, "use": [ "exports-loader?module.exports.toString()", { "loader": "css-loader", "options": { "sourceMap": false, "importLoaders": 1 } }, { "loader": "postcss-loader", "options": { "ident": "postcss", "plugins": postcssPlugins } }, { "loader": "sass-loader", "options": { "sourceMap": false, "precision": 8, "includePaths": [] } } ] }, { "exclude": [ path.join(process.cwd(), "src\\styles.css") ], "test": /\.less$/, "use": [ "exports-loader?module.exports.toString()", { "loader": "css-loader", "options": { "sourceMap": false, "importLoaders": 1 } }, { "loader": "postcss-loader", "options": { "ident": "postcss", "plugins": postcssPlugins } }, { "loader": "less-loader", "options": { "sourceMap": false } } ] }, { "exclude": [ path.join(process.cwd(), "src\\styles.css") ], "test": /\.styl$/, "use": [ "exports-loader?module.exports.toString()", { "loader": "css-loader", "options": { "sourceMap": false, "importLoaders": 1 } }, { "loader": "postcss-loader", "options": { "ident": "postcss", "plugins": postcssPlugins } }, { "loader": "stylus-loader", "options": { "sourceMap": false, "paths": [] } } ] }, { "include": [ path.join(process.cwd(), "src\\styles.css") ], "test": /\.css$/, "use": [ "style-loader", { "loader": "css-loader", "options": { "sourceMap": false, "importLoaders": 1 } }, { "loader": "postcss-loader", "options": { "ident": "postcss", "plugins": postcssPlugins } } ] }, { "include": [ path.join(process.cwd(), "src\\styles.css") ], "test": /\.scss$|\.sass$/, "use": [ "style-loader", { "loader": "css-loader", "options": { "sourceMap": false, "importLoaders": 1 } }, { "loader": "postcss-loader", "options": { "ident": "postcss", "plugins": postcssPlugins } }, { "loader": "sass-loader", "options": { "sourceMap": false, "precision": 8, "includePaths": [] } } ] }, { "include": [ path.join(process.cwd(), "src\\styles.css") ], "test": /\.less$/, "use": [ "style-loader", { "loader": "css-loader", "options": { "sourceMap": false, "importLoaders": 1 } }, { "loader": "postcss-loader", "options": { "ident": "postcss", "plugins": postcssPlugins } }, { "loader": "less-loader", "options": { "sourceMap": false } } ] }, { "include": [ path.join(process.cwd(), "src\\styles.css") ], "test": /\.styl$/, "use": [ "style-loader", { "loader": "css-loader", "options": { "sourceMap": false, "importLoaders": 1 } }, { "loader": "postcss-loader", "options": { "ident": "postcss", "plugins": postcssPlugins } }, { "loader": "stylus-loader", "options": { "sourceMap": false, "paths": [] } } ] }, { "test": /\.ts$/, "loader": "@ngtools/webpack" } ] }, "plugins": [ new NoEmitOnErrorsPlugin(), new CopyWebpackPlugin([ { "context": "src", "to": "", "from": { "glob": "assets/**/*", "dot": true } }, { "context": "src", "to": "", "from": { "glob": "favicon.ico", "dot": true } } ], { "ignore": [ ".gitkeep" ], "debug": "warning" }), new ProgressPlugin(), new CircularDependencyPlugin({ "exclude": /(\\|\/)node_modules(\\|\/)/, "failOnError": false }), new NamedLazyChunksWebpackPlugin(), new HtmlWebpackPlugin({ "template": "./src\\index.html", "filename": "./index.html", "hash": false, "inject": true, "compile": true, "favicon": false, "minify": false, "cache": true, "showErrors": true, "chunks": "all", "excludeChunks": [], "title": "Webpack App", "xhtml": true, "chunksSortMode": function sort(left, right) { let leftIndex = entryPoints.indexOf(left.names[0]); let rightindex = entryPoints.indexOf(right.names[0]); if (leftIndex > rightindex) { return 1; } else if (leftIndex < rightindex) { return -1; } else { return 0; } } }), new BaseHrefWebpackPlugin({}), new CommonsChunkPlugin({ "name": [ "inline" ], "minChunks": null }), new CommonsChunkPlugin({ "name": [ "vendor" ], "minChunks": (module) => { return module.resource && (module.resource.startsWith(nodeModules) || module.resource.startsWith(genDirNodeModules) || module.resource.startsWith(realNodeModules)); }, "chunks": [ "main" ] }), new SourceMapDevToolPlugin({ "filename": "[file].map[query]", "moduleFilenameTemplate": "[resource-path]", "fallbackModuleFilenameTemplate": "[resource-path]?[hash]", "sourceRoot": "webpack:///" }), new CommonsChunkPlugin({ "name": [ "main" ], "minChunks": 2, "async": "common" }), new NamedModulesPlugin({}), new AotPlugin({ "mainPath": "main.ts", "replaceExport": false, "hostReplacementPaths": { "environments\\environment.ts": "environments\\environment.ts" }, "exclude": [], "tsConfigPath": "src\\tsconfig.app.json", "skipCodeGeneration": true }), new CompressionPlugin({}) ], "node": { "fs": "empty", "global": true, "crypto": "empty", "tls": "empty", "net": "empty", "process": true, "module": false, "clearImmediate": false, "setImmediate": false }, "devServer": { "historyApiFallback": true } }; 生成:

@angular/cli

我正在使用1.4.4 myList = ["One","two","One","tree"]; myNewList = Array.from(new Set(myList ));

请注意,我这样做的主要原因是为了改进一些搜索引擎优化建议,因为显然我的vendor.css是600Kb大并且在PageSpeed Ingishts中被指出:您的页面有1个阻止CSS资源。这会导致呈现页面的延迟。它只包含第三方css - 实际上只有bootstrap + font-awesome。除非有其他东西可以防止这种情况,否则我会想到压缩。我还认为Web服务器会自动压缩并提供.gz文件,但我不知道该测试是否适用。

非常感谢任何帮助!感谢

1 个答案:

答案 0 :(得分:1)

仅在根webpack.config.js文件上公开处理弹出的应用程序的构建。未被弹出(或设置为ejected: false)的应用程序将完全忽略此webpack.config.js文件。

因此,为了使用gzip压缩文件,您需要使用弹出的应用程序并使用自动添加到package.json的新npm脚本。

而不是'ng build',现在应该运行:

npm run build

我的相关答案可能有所帮助: