AdiHuang's notes

webpack-basic-applications.md

webpack4 基本设置应用示例 (Nodejs -v10)

dist node modules src package.json webpack.config.js webpack.config.entry.js(把需要编译的多个js入口单独写配置文件) npm install 安装命令(每个项目仅需执行一次) npm run scrip

目录结构

dist
|  font
|  |  ...
|  images
|  |  ...
|  js
|  |  index.js
|  css
|  |  styles.css
node_modules
src
|  font
|  |  ...
|  images
|  |  ...
|  js
|  |  module
|  |  |  loading.js
|  |  |  ...
|  |  index.js
|  scss
|  |  base
|  |  |  ...
|  |  function
|  |  |  ...
|  |  layout
|  |  |  ...
|  |  mixin
|  |  |  ...
|  |  _variables.scss
|  |  styles.scss
package.json
webpack.config.js
webpack.config.entry.js(把需要编译的多个js入口单独写配置文件)

使用方法

npm install 安装命令(每个项目仅需执行一次) npm run-script build 编译一次,并压缩文件 npm start 编译并启动监听

package.json

{
  "name": "front-env-webpack4",
  "description": "",
  "version": "1.0.0",
  "private": true,
  "license": "ISC",
  "scripts": {
    "build": "webpack -p --progress --mode production",
    "start": "webpack -w --progress --mode development"
  },
  "devDependencies": {
    "ajv": "^6.5.2",
    "babel-core": "^6.26.3",
    "babel-loader": "^7.1.5",
    "babel-preset-env": "^1.7.0",
    "css-loader": "^1.0.0",
    "extract-text-webpack-plugin": "^4.0.0-beta.0",
    "file-loader": "^1.1.11",
    "node-sass": "^4.9.2",
    "optimize-css-assets-webpack-plugin": "^5.0.0",
    "postcss-loader": "^2.1.6",
    "sass-loader": "^7.0.3",
    "style-loader": "^0.21.0",
    "uglifyjs-webpack-plugin": "^1.2.7",
    "webpack": "^4.16.1",
    "webpack-cli": "^3.0.8"
  },
  "dependencies": {}
}

webpack.config.js

var path = require('path')
var ExtractTextPlugin = require('extract-text-webpack-plugin')

module.exports = {
  entry: './src/js/index.js',
  // entry: require('./webpack.config.entry'),
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'js/index.js'
    // filename: 'js/[name].js'
  },
  resolve: {
    extensions: ['*', '.js']
  },
  module: {
    rules: [
      {
        test: /\.js?$/,
        include: path.resolve(__dirname, 'src/js'),
        use: [
          {
            loader: 'babel-loader',
            options: {
              presets: ['env']
            }
          }
        ]
      },
      {
        test: /\.(scss|css)$/,
        loader: ExtractTextPlugin.extract({
          fallback: 'style-loader',
          publicPath: '../',
          use: [
            {
              loader: 'css-loader',
              options: {
                minimize: true
              }
            },
            { loader: 'sass-loader' },
            {
              loader: 'postcss-loader',
              options: {
                options: {}
              }
            }
          ]
        })
      },
      {
        test: /\.(svg|png|jpe?g)(\?\S*)?$/,
        use: [
          {
            loader: 'file-loader?name=images/[name].[ext]'
          }
        ]
      },
      {
        test: /\.(eot|svg|ttf|woff|woff2)$/,
        exclude: [/images/],
        use: [
          {
            loader: 'file-loader?name=fonts/[name].[ext]'
          }
        ]
      }
    ]
  },
  plugins: [
    new ExtractTextPlugin('css/styles.css')
    // new ExtractTextPlugin('css/[name].css')
  ]

}

webpack.config.entry.js

var path = require('path');

module.exports = {
  'index': path.resolve(__dirname, './src/js/index.js'),
  // ...
}

index.js

require('./../scss/style.scss');  // modify the style.scss

import { loading } from './module/loading';

window.onload = function () {

  // loading
  loading();

};

loading.js

export let loading = () => {

  (function ($) {
    'use strict';

    let loadingHTML = `<div class="loading"></div>`;

    $(document).ajaxStart(function() {
      $('body').append(loadingHTML);
    })

    $(document).ajaxStop(function() {
      $('.loading').remove();
    })
    
  })(jQuery);
}