我遇到了 webpack 没有从供应商VUE 组件中提取 CSS 的问题。
Html 头部看起来像这样:https ://i.stack.imgur.com/AbtkC.png
所有这些样式标签仅来自供应商Vue 组件。在从 Javascript 加载页面后插入
我的 vue 组件中的其他样式,我的 LESS 文件,来自非 vue供应商包的样式被正确拆分为main.css和vendor.css
配置中缺少什么?(底部)
谢谢
webpack.config.js
常量 webpack = require('webpack'); 常量 HtmlWebpackPlugin = require('html-webpack-plugin'); const ExtractTextPlugin = require('extract-text-webpack-plugin'); const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin'); const utils = require('./utils'); 常量路径 = 要求('路径'); const isProduction = process.env.NODE_ENV === 'production'; const SRC_PATH = path.join(__dirname, 'src'); const DIST_PATH = path.join(__dirname, !isProduction ? 'www-dev' : 'www'); 函数解析(目录){ return path.join(__dirname, '../', dir) } 模块.exports = { 开发工具:!isProduction ?'inline-source-map' :未定义, 入口: { 主要的: [ SRC_PATH + '/main.less', SRC_PATH + '/main.js', ] }, 输出: { 路径:DIST_PATH, 公共路径:'', 文件名:!isProduction ? '[name].js' : '[name].min.js?c=[chunkhash]', sourceMapFilename: !isProduction ? '[名称].js.map':未定义 }, 模块: { 规则:utils.styleLoaders({ sourceMap: true, extract: true }) .concat([{ 测试:/\.vue$/, 加载器:'vue-loader', 选项: { 加载器:utils.cssLoaders({ 源地图:真, 提取:真 }) }, }, { 测试:/\.js$/, 加载器:'babel-loader', 排除:/node_modules/ }, { 测试:/\.(woff2?|ttf|eot|otf)$/, 加载器:'文件加载器', 选项: { 名称:路径 => { if(!/node_modules|bower_components/.test(path)) 返回'字体/[名称]。[哈希]。[ext]'; 返回“字体/供应商/”+路径 .replace(/\\/g, '/') 。代替( /((.*(node_modules|bower_components))|fonts|font|assets)\//g, '' ) + '?[哈希]'; }, 公共路径:'./' } }, { 测试:/\.(bmp|png|jpe?g|gif|svg|ico|ani|cur)$/, 装载机:[{ 加载器:'文件加载器', 选项: { 名称:路径 => { if(!/node_modules|bower_components/.test(path)) 返回'图像/[名称]。[哈希]。[ext]'; 返回“图像/供应商/”+路径 .replace(/\\/g, '/') 。代替( /((.*(node_modules|bower_components))|images|image|img|assets)\//g, '' ) + '?[哈希]'; }, 公共路径:'./' } }, “图像加载器” ] } ]) }, 解决: { 别名:{ 'vue$': 'vue/dist/vue.esm.js', '~': 解析('node_modules'), '@':解析('src') } }, 插件:[], 表现: { 提示:假 } } //开发和生产插件 模块.exports.plugins.push( //环境 新的 webpack.DefinePlugin({ 'process.env': { NODE_ENV: '"' + (!isProduction ? 'development' : 'production') + '"' } }), //提取CSS到文件 新的 ExtractTextPlugin({ 文件名: !isProduction ? '[name].css?c=[chunkhash]' : '[name].min.css?c=[chunkhash]' }), //提取供应商CSS/JS 新的 webpack.optimize.CommonsChunkPlugin({ 名称:'供应商', minChunks:函数(模块){ return module.context && module.context.indexOf('node_modules') !== -1; } }), //提取html 新的 HtmlWebpackPlugin({ 文件名:'index.html', 模板:SRC_PATH + '/index.html', 注入:真, chunksSortMode: '依赖', 缩小:!isProduction ?不明确的 : { 删除评论:真, 折叠空白:真, removeAttributeQuotes: 真 } }) ); if(!isProduction) //开发的东西 模块.exports.plugins.push( // 热模块更换..不知道 新的 webpack.HotModuleReplacementPlugin(), // 使用 NoEmitOnErrorsPlugin 跳过发射 // 编译时出现错误时的阶段。 // 这确保不会发出包含错误的资产。 新的 webpack.NoEmitOnErrorsPlugin() ); 别的 //生产 模块.exports.plugins.push( // 优化 CSS 新的 OptimizeCSSPlugin({ cssProcessorOptions: { 安全:真实 } }), // 缩小 JS 新的 webpack.optimize.UglifyJsPlugin({ 源地图:真, 压缩:{ 警告:错误 } }) );
实用程序.js
const ExtractTextPlugin = require('extract-text-webpack-plugin') 出口.cssLoaders = 功能(选项){ 选项 = 选项 || {} 变量 cssLoader = { 加载器:'css-loader', 选项: { 最小化:process.env.NODE_ENV === 'production', sourceMap:options.sourceMap } } // 生成与提取文本插件一起使用的加载器字符串 函数 generateLoaders(loader, loaderOptions) { var loader = [cssLoader] 如果(加载器){ 装载机.push({ 装载机:装载机+'-装载机', 选项:Object.assign({}, loaderOptions, { sourceMap:options.sourceMap }) }) } // 指定该选项时提取 CSS //(在生产构建期间就是这种情况) 如果(选项。提取){ 返回ExtractTextPlugin.extract({ 用途:装载机, 后备:'vue-style-loader' }) } 别的 { 返回 ['vue-style-loader'].concat(loaders) } } // https://vue-loader.vuejs.org/en/configurations/extract-css.html 返回 { css:生成加载器(), postcss: generateLoaders(), 少:generateLoaders('少'), sass: generateLoaders('sass', { indentedSyntax: true }), scss: generateLoaders('sass'), 手写笔:generateLoaders('stylus'), styl: generateLoaders('stylus') } } // 为独立样式文件(.vue 之外)生成加载器 出口.styleLoaders = 功能(选项){ 变量输出 = [] var loaders = exports.cssLoaders(options) for(加载器中的 var 扩展){ var loader = loaders[扩展名] 输出.推({ 测试:新正则表达式('\\.' + 扩展名 + '$'), 用途:装载机 }) } 返回输出 }
包.json
{ “名称”:“vue 测试”, "description": "一个 Vue.js 项目", “版本”:“1.0.0”, “作者”: ””, “私人”:真的, “脚本”:{ "start": "cross-env NODE_ENV=development webpack-dev-server --hot --config=webpack.dev.config.js", "build": "cross-env NODE_ENV=development webpack --config=webpack.config.js --progress --hide-modules", "watch": "npm run build -- --watch", "release": "cross-env NODE_ENV=production webpack --config=webpack.config.js --progress --hide-modules" }, “依赖”:{ "axios": "^0.16.2", "字体真棒": "^4.7.0", “材料设计图标”:“^3.0.1”, “速度动画”:“^1.5.0”, "vue": "^2.4.1", "vue-directive-tooltip": "^1.2.3", "vue-image-lightbox": "^5.5.3", "vue-images": "^1.0.10", "vue-js-modal": "^1.2.2", "vue-lazyload": "^1.0.6", "vue-router": "^2.7.0", "vue-select": "^2.2.0", "vue-touch": "^2.0.0-beta.4", "vue2-dropzone": "^2.3.5", "vuejs-datepicker": "^0.9.4", “vuetify”:“^0.13.1”, "vuex": "^2.3.1", “vuex-路由器同步”:“^4.2.0” }, “开发依赖”:{ "babel-core": "^6.0.0", "babel-loader": "^6.0.0", "babel-preset-env": "^1.5.1", "babel-preset-stage-2": "^6.24.1", “布尔玛”:“^0.4.3”, “跨环境”:“^3.0.0”, "css-loader": "^0.25.0", "cssnano": "^3.10.0", "提取文本 webpack 插件": "^2.1.2", "文件加载器": "^0.9.0", "html-webpack-plugin": "^2.29.0", "img-loader": "^2.0.0", "少": "^2.7.2", "less-loader": "^4.0.4", “节点萨斯”:“^4.5.0”, "优化-css-assets-webpack-plugin": "^2.0.0", "sass-loader": "^5.0.1", "vue-loader": "^13.0.2", “vue 模板编译器”:“^2.3.3”, "webpack": "^2.6.1", “webpack-dev-server”:“^2.4.5” } }