Webpack - 尝试将我的 CSS 和 JS 文件路由/编译到 dist/ 文件夹中的 CSS 和 JS 特定子文件夹

Posted

技术标签:

【中文标题】Webpack - 尝试将我的 CSS 和 JS 文件路由/编译到 dist/ 文件夹中的 CSS 和 JS 特定子文件夹【英文标题】:Webpack - trying to route/compile my CSS and JS files into CSS and JS specific sub-folders within dist/ folder 【发布时间】:2019-01-23 23:19:18 【问题描述】:

总的来说,我对 webpack 还是很陌生。真的才几天。在大多数情况下,我觉得我在设置 webpack 并将其集成到本地开发环境方面取得了相当不错的进展。在此过程中存在相当多的错误和命令行错误,但到目前为止我能够解决其中的大部分问题。向 Maxmillian Schwärzmuller 在 Webpack 上的简短 YT 系列大喊,让我开始。

现在我正在尝试重新定位/扩展我已经掌握的一些概念,但是我还没有成功让我的npm run build(这将是生产命令)来编译我的 CSS文件分别放入 CSS 和 JS 子文件夹(位于站点根目录之外)。

我觉得我在尝试在我的 JS 和 CSS 特定测试块中使用 file-loader 包方面取得了更大的进步,但现在我想知道我是不是误解了 file-loader 包的目的或者只是没有正确配置它。

这是我的webpack.config.js 文件的内容:

const path = require('path');
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const htmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

const extractPlugin = new ExtractTextPlugin(
   filename: 'styles.css'
);

module.exports = 
  entry: './src/js/app.js',
  output: 
    path: path.resolve(__dirname, 'dist'),
    filename: 'app.bundle.js'
  ,
  module: 
    rules: [
      
        test: /\.js$/,
        use: [
          
            loader: 'babel-loader',
            options: 
              presets: ['babel-preset-env']
            
          
          // attempted to replicate the same use statement as seen below for the jpg/png test
          // and only app.js (not app.bundle.js) was dropped into dist/js/
          // 
          //   loader: 'file-loader',
          //   options: 
          //     name: '[name].[ext]',
          //     outputPath: 'js/',
          //     publicPath: 'js/'

          //   
          // 
        ]
      ,
      
        test: /\.scss$/,
        use: extractPlugin.extract(
          use: ['css-loader', 'sass-loader']
        )
        // attempted to modify/replicate the above use statement
          // use: [
            // 
              // loader: 'css-loader',
              // loader: 'sass-loader'
              // loader: 'file-loader',
              // options: 
              //   name: '[name].[ext]',
              //   outputPath: 'css/',
              //   publicPath: 'css/'
              // 
            // 
          // ]
      ,
      
        test: /\.html$/,
        use: [
          
            loader: 'html-loader'
          
        ]
      ,
      
        test: /\.(jpg|png)$/,
        use: [
          
            loader: 'file-loader',
            options: 
              name: '[name].[ext]',
              outputPath: 'images/',
              publicPath: 'images/'
            
          
        ]
      ,
      
        test: /\.html$/,
        use: [
          
            loader: 'file-loader',
            options: 
              name: '[name].[ext]'
            
          
        ],
        exclude: path.resolve(__dirname, 'src/index.html')
      
    ]
  ,
  plugins: [
    new webpack.ProvidePlugin(
      $: 'jquery',
      jQuery: 'jquery'
    ),
    extractPlugin,
    new HtmlWebpackPlugin(
      filename: 'index.html',
      template: 'src/index.html'
    ),
    new CleanWebpackPlugin(['dist'])
  ]
;

这是package.json 文件:

  
  "name": "nodomaintoseehere.com",
  "version": "1.0.0",
  "description": "Site repository v1.0",
  "private": true,
  "main": "./src/app.js",
  "scripts": 
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "webpack-dev-server",
    "build": "webpack -p"
  ,
  "author": "Jeremy Wilson",
  "license": "ISC",
  "devDependencies": 
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
    "babel-polyfill": "^6.26.0",
    "babel-preset-env": "^1.7.0",
    "babel-preset-es2015": "^6.24.1",
    "clean-webpack-plugin": "^0.1.19",
    "cross-env": "^5.2.0",
    "css-loader": "^1.0.0",
    "extract-text-webpack-plugin": "^3.0.2",
    "file-loader": "^1.1.11",
    "html-loader": "^0.5.5",
    "html-webpack-plugin": "^3.2.0",
    "jquery": "^3.3.1",
    "node-sass": "^4.9.3",
    "sass-loader": "^7.1.0",
    "webpack": "^3.12.0",
    "webpack-cli": "^3.1.0",
    "webpack-dev-server": "^2.11.2"
  ,
  "dependencies": 
    "bootstrap": "^4.1.3",
    "lodash": "^4.17.10"
  

最后是app.js 文件

import '../css/styles.scss';
import 'babel-polyfill';
import $ from 'jquery';

提前致谢。

【问题讨论】:

解释为什么默认行为不适合您的问题或您要完成的工作 默认行为是将 app.bundle.js 和 styles.css 文件转储到根 (dist) 文件夹中。我不想要那个。我希望它们分别转移到自己的 /js 和 /css 子目录中。 webpack.config.js 中注释掉的代码未能成功达到预期的效果。 【参考方案1】:

将资产放入不同的子文件夹不会对性能和使用产生任何影响,因为它们每次都将位于您的静态服务器上,直到重新部署为止。

没有办法将 js 文件输出到 js 文件夹,因为 babel loader 上没有选项,并且 file-loader 不处理 js,它们只是发出文件,在你的情况下,它最终会出现重复的文件。文件加载器不适合处理 javascript 文件。

对于css,可以配置extract-text-plugin。

const path = require('path');
const webpack = require('webpack');
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');

const extractPlugin = new ExtractTextPlugin(
   filename: 'css/styles.css' // <---
);

module.exports = 
  entry: './src/js/app.js',
  output: 
    path: path.resolve(__dirname, 'dist'),
    filename: 'app.bundle.js'
  ,
  module: 
    rules: [
      
        test: /\.js$/,
        use: [
          
            loader: 'babel-loader',
            options: 
              presets: ['babel-preset-env']
            
          
        ]
      ,
      
        test: /\.scss$/,
        use: extractPlugin.extract(
          use: ['css-loader', 'sass-loader']
        )
      ,
      
        test: /\.html$/,
        use: [
          
            loader: 'html-loader'
          
        ]
      ,
      
        test: /\.(jpg|png)$/,
        use: [
          
            loader: 'file-loader',
            options: 
              name: '[name].[ext]',
              outputPath: 'images/',
              publicPath: 'images/'
            
          
        ]
      ,
      
        test: /\.html$/,
        use: [
          
            loader: 'file-loader',
            options: 
              name: '[name].[ext]'
            
          
        ],
        exclude: path.resolve(__dirname, 'src/index.html')
      
    ]
  ,
  plugins: [
    new webpack.ProvidePlugin(
      $: 'jquery',
      jQuery: 'jquery'
    ),
    extractPlugin,
    new HtmlWebpackPlugin(
      filename: 'index.html',
      template: 'src/index.html'
    ),
    new CleanWebpackPlugin(['dist'])
  ]
;

【讨论】:

好的。我明白。我这样做的唯一真正要求是它反映了我过去使用的目录结构,并且只会帮助组织我的文件。我认为当我输入这个问题时,你的建议对我来说是冒泡的,所以我很高兴看到我接近另一个可能的解决方案。谢谢。 构建文件是毫无意义的,它们只是被编译并单独放置。最好担心开发文件,这会浪费更多时间!

以上是关于Webpack - 尝试将我的 CSS 和 JS 文件路由/编译到 dist/ 文件夹中的 CSS 和 JS 特定子文件夹的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法用webpack动态加载css文件

Webpack配置有一个未知属性'preLoaders'

Webpack 配置具有未知属性“preLoaders”

Webpack 不会将我使用的图像复制到反应组件中

在 Vue CLI 3 中使用 Extract-Text-Webpack-Plugin

Webpack 导入引导程序 .js 和 .css