2017-03-16 15 views
6

Dưới đây là cấu trúc thư mục của tôi:Làm cách nào để ghép và sao chép các tệp CSS từ thư mục nguồn sang thư mục dist?

enter image description here

Tôi muốn rút gọn và bó các file CSS bên src/css thư mục và đầu ra nó như là một tập tin CSS đơn bên dist tôi. Tất cả các ví dụ tôi đã thấy cho đến nay đề nghị require -ing tệp CSS bên trong tệp JS. Tôi không muốn điều đó. Có cách nào để định cấu hình trong webpack.config.js để chỉ rút gọn và sao chép các tệp này không?

Trả lời

2

Có hoạt động.

Install dev-dependecies

npm i extract-text-webpack-plugin --save-dev 
npm i css-loader --save-dev 

webpack.config.js

const webpack = require('webpack'); 
const ExtractTextPlugin = require('extract-text-webpack-plugin') 
const extractCSS = new ExtractTextPlugin('bundle.min.css') 

module.exports = { 
    entry: { 
    'bundle.min.css': [ 
     __dirname + '/src/styles/abc.css', 
     __dirname + '/src/styles/xyz.css', 
     __dirname + '/src/styles/mno.css' 
    ] 
    }, 
    devtool: '', 
    output: { 
    path: __dirname + '/dist/styles/', 
    filename: '[name]' 

    }, 
    module: { 
    rules: [{ 
     test: /\.css$/i, 
     use: extractCSS.extract({ 
      use: { 
      loader: 'css-loader', 
      options: { 
       minimize: true 
      } 
      } 
     }) 
    }] 
    }, 
    resolve: { 
    alias: {}, 
    modules: [], 
    extensions: ['.css'] 
    }, 
    plugins: [ 
    extractCSS 
    ] 
}; 

bundle.min.css sẽ được tạo ra. Dựa trên minimize: true/false, việc rút gọn sẽ được quyết định. Thưởng thức!

+0

Có cần phải chỉ định tất cả các tệp css trong mục nhập không? – Bonomi

+0

Phải, vì một tệp css sẽ không bao gồm một tệp khác. Vì vậy, người ta phải viết nó bằng tay. Trong trường hợp tệp JS, cần một điểm vào và tất cả các tệp js khác được nhập sẽ tự động được nhóm. Hình dung đồ thị của các câu lệnh đã nhập và bạn sẽ hiểu. – softvar

0

Nó sẽ đi theo ba bước;

trước tiên, bạn sẽ cần hai trình tải và plugin; có tên là css-loaderstyle-loaderextract-text-webpack-plugin tương ứng.

Sau đó, cấu hình của bạn có thể trông giống như sau:

const webpack = require('webpack'); 
const ExtractTextPlugin = require("extract-text-webpack-plugin"); 
const path = require('path'); 
module.exports = { 
    entry: { 
    app: './src/index.js' 
    }, 
    output: { 
    path: 'dist', 
    filename: 'js/[name]-bundle.js' 
    }, 
    devtool: "cheap-source-map", 
    resolveLoader: { 
    modules: [ 
     'node_modules', 
     path.join(__dirname, '../node_modules'), 
    ] 
    }, 
    module: { 
    loaders: [ 
     { 
     test: /.css?$/, 
     loader: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader' }), 
     exclude: /node_modules/ 
     } 
    ] 
    }, 
    plugins: [ 
    new ExtractTextPlugin("css/[name].css"), 
    new webpack.optimize.UglifyJsPlugin({ 
     compress: { 
     warnings: false, 
     screw_ie8: true, 
     conditionals: true, 
     unused: true, 
     comparisons: true, 
     sequences: true, 
     dead_code: true, 
     evaluate: true, 
     join_vars: true, 
     if_return: true 
     }, 
     output: { 
     comments: false 
     } 
    }), 
    ] 
} 

Và sau đó trong tập tin nhập của bạn, yêu cầu họ như require('./style.css');

Hãy nhớ rằng, nó sẽ đi theo con đường như là nguồn của bạn.

Nếu bạn đang tải các tệp phông chữ và hình ảnh trong css, bạn có thể cần plugin file-loader cũng sẽ sao chép tất cả nội dung trong thư mục.

Các cấu hình tập tin-loader sẽ trông giống như:

{ 
    test: /.png?$/, 
    loader: 'file-loader?name=img/[name].[ext]', 
    exclude: /node_modules/ 
} 

Các UgligyJsPlugin cũng sẽ rút gọn CSS.

+0

Có cách nào để thực hiện việc này mà không cần 'yêu cầu' CSS từ tệp JS không? Điều đó cảm thấy rất kỳ quặc. – Saravana

+0

CSS sẽ không được thêm vào tệp JS, nó chỉ là một yêu cầu, có nghĩa là ứng dụng JS phụ thuộc vào các tệp CSS. Cấu hình này là dạng thẳng của một trong các ứng dụng của tôi. – Pankaj

Các vấn đề liên quan