webpack Rookie Learning

Keywords: Javascript Webpack npm JSON less

Webpack is a front-end tool that allows modules to be loaded, preprocessed, and packaged. It has all the basic functions of Grunt or Gulp.

Previously, gulp was used to do css and js for pages, packaging was compressed, configuration was simple, but it was too cumbersome. When using sass, importing sass files directly into sass was prone to error (I don't know what's wrong)

What makes webpack s interesting to me: modular, load on demand, compressed css, inline styles, stand-alone styles.Compress js, compress pages

Reference article: http://www.jianshu.com/p/42e11515c10f (version 1.0)

Learning video: http://www.imooc.com/learn/802 (version 1.0)

Install webpack version 2.0 yourself (something to note)

I. Installation

Install test node s and npm

1 $ node -v
2 v6.11.0
$ npm -v
3.10.10

Create a new folder webpack, enter the project directory webpack, and install:

1, use NPM init-y to generate package.json file

npm init -y

2, Install webpack (looks like a global installation of webpack, which can be packaged by typing webpack directly from the command line)

//Global Installation
npm install -g webpack
//Install to your project directory
npm install --save-dev webpack

Testing webpack version: $webpack -v > 2.6.1

2. Configuration

New webpack.config.js

module.exports = {

  entry:{
    main:"./src/app.js",
  } ,//The only entry file mentioned many times

  output: {
    path: __dirname + "/dist",//Where to store packaged files
    filename: "js/[name].js",//File name of the packaged output file
  //publicPath:'http://hotdeals.com/', //online is the replacement address
} }

 

HtmlWebpackPlugin

Help you generate the final Html5 file based on a simple template

npm install --save-dev html-webpack-plugin

 

    plugins:[
        new htmlWebpackPlugin({
            filename:'index.html',
            template:'index.html',
            inject:'body',
            title:'home page',
        }),
    ]

 

Loaders


Loaders comes on!

Loaders is one of the most exciting features of a webpack.By using different loader s, webpacks can handle a wide variety of formats of files by calling external scripts or tools, such as analyzing JSON files and converting them into JavaScript files, or converting the next generation of JS files (ES6, ES7) into JS files that modern browsers can recognize.Or for React development, the appropriate Loaders can convert React's JSX files into JS files.


Loaders need to be installed separately and configured under the module keyword under webpack.config.js. The configuration options for Loaders include the following:


  • test: a regular expression matching the extension of the file that loaders processes (must)
  • Name of loader:loader (must)
  • include/exclude: Manually add files (folders) that must be processed or block files (folders) that do not need to be processed (optional);
  • query: Provide additional setup options for loaders (optional)

Babel


Babel is actually a platform for compiling JavaScript, and its power is manifested in the following ways that compilation can help you:


  • Next-generation JavaScript standards (ES6, ES7), which are not currently fully supported by current browsers;
  • Extended languages based on JavaScript, such as React's JSX
// npm Install multiple dependent modules at once, separated by spaces
npm install --save-dev babel-core babel-loader babel-preset-es2015 babel-preset-react

 

{
                test: /\.js$/,
                loader: 'babel-loader',
                include: path.resolve(__dirname,'src'),
                exclude: path.resolve(__dirname,'node_modules'),
                query:{
                    presets:["es2015"]
                }
             }

CSS, CSS Preprocessor

First install postcss-loader and autoprefixer (plug-ins that add prefixes automatically)

npm install --save-dev style-loader css-loader
{
                 test:/\.css$/,
                 loader: [
                  'style-loader',
                  { loader: 'css-loader', options: { importLoaders: 1 } },
                  'postcss-loader'
                ]
             }
npm install --save-dev less-loader less 
npm install --save-dev postcss-loader autoprefixer

 

After completing a series of operations

 

package.json:

{
  "name": "webpack",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "webpack": "webpack --config webpack.config.js --progress --display-module --colors"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "autoprefixer": "^7.1.1",
    "babel-core": "^6.25.0",
    "babel-loader": "^7.0.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-latest": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "css-loader": "^0.28.4",
    "file-loader": "^0.11.2",
    "html-loader": "^0.4.5",
    "html-minify-loader": "^1.1.0",
    "html-webpack-plugin": "^2.28.0",
    "image-webpack-loader": "^3.3.1",
    "less": "^2.7.2",
    "less-loader": "^4.0.4",
    "postcss-loader": "^2.0.5",
    "style-loader": "^0.18.2",
    "url-loader": "^0.5.9",
    "webpack": "^2.6.1"
  },
  "dependencies": {
    "acorn": "^5.0.3",
    "acorn-dynamic-import": "^2.0.2",
    "ajv": "^4.11.8",
    "anymatch": "^1.3.0",
    "align-text": "^0.1.4",
    "arr-diff": "^2.0.0",
    "arr-flatten": "^1.0.3",
    "array-unique": "^0.2.1",
    "arrify": "^1.0.1",
    "asn1.js": "^4.9.1",
    "async": "^2.4.1",
    "async-each": "^1.0.1",
    "balanced-match": "^1.0.0",
    "base64-js": "^1.2.0",
    "binary-extensions": "^1.8.0",
    "bn.js": "^4.11.6",
    "brace-expansion": "^1.1.8",
    "braces": "^1.8.5",
    "brorand": "^1.1.0",
    "browserify-aes": "^1.0.6",
    "browserify-cipher": "^1.0.0",
    "browserify-des": "^1.0.0",
    "browserify-sign": "^4.0.4",
    "browserify-zlib": "^0.1.4",
    "buffer": "^4.9.1",
    "buffer-xor": "^1.0.3",
    "builtin-modules": "^1.1.1",
    "builtin-status-codes": "^3.0.0",
    "camelcase": "^3.0.0",
    "center-align": "^0.1.3",
    "chokidar": "^1.7.0",
    "cipher-base": "^1.0.3",
    "co": "^4.6.0",
    "cliui": "^3.2.0",
    "browserify-rsa": "^4.0.1",
    "code-point-at": "^1.1.0",
    "assert": "^1.4.1",
    "concat-map": "^0.0.1",
    "console-browserify": "^1.1.0",
    "constants-browserify": "^1.0.0",
    "create-hmac": "^1.1.6",
    "create-ecdh": "^4.0.0",
    "crypto-browserify": "^3.11.0",
    "create-hash": "^1.1.3",
    "date-now": "^0.1.4",
    "decamelize": "^1.2.0",
    "des.js": "^1.0.0",
    "diffie-hellman": "^5.0.2",
    "domain-browser": "^1.1.7",
    "elliptic": "^6.4.0",
    "enhanced-resolve": "^3.1.0",
    "errno": "^0.1.4",
    "events": "^1.1.1",
    "error-ex": "^1.3.1",
    "expand-brackets": "^0.1.5",
    "expand-range": "^1.8.2",
    "extglob": "^0.3.2",
    "filename-regex": "^2.0.1",
    "fill-range": "^2.2.3",
    "find-up": "^1.1.2",
    "for-own": "^0.1.5",
    "evp_bytestokey": "^1.0.0",
    "get-caller-file": "^1.0.2",
    "fsevents": "^1.1.1",
    "glob-base": "^0.3.0",
    "for-in": "^1.0.2",
    "glob-parent": "^2.0.0",
    "graceful-fs": "^4.1.11",
    "has-flag": "^1.0.0",
    "hash.js": "^1.0.3",
    "hash-base": "^2.0.2",
    "hmac-drbg": "^1.0.1",
    "hosted-git-info": "^2.4.2",
    "html-webpack-plugin": "^2.28.0",
    "https-browserify": "^0.0.1",
    "ieee754": "^1.1.8",
    "ajv-keywords": "^1.5.1",
    "indexof": "^0.0.1",
    "invert-kv": "^1.0.0",
    "interpret": "^1.0.3",
    "is-arrayish": "^0.2.1",
    "is-binary-path": "^1.0.1",
    "is-buffer": "^1.1.5",
    "is-dotfile": "^1.0.3",
    "is-builtin-module": "^1.0.0",
    "is-equal-shallow": "^0.1.3",
    "is-extendable": "^0.1.1",
    "is-extglob": "^1.0.0",
    "is-fullwidth-code-point": "^1.0.0",
    "is-glob": "^2.0.1",
    "is-number": "^3.0.0",
    "is-posix-bracket": "^0.1.1",
    "is-primitive": "^2.0.0",
    "is-utf8": "^0.2.1",
    "json-loader": "^0.5.4",
    "json-stable-stringify": "^1.0.1",
    "jsonify": "^0.0.0",
    "kind-of": "^4.0.0",
    "isobject": "^2.1.0",
    "lazy-cache": "^1.0.4",
    "lcid": "^1.0.0",
    "load-json-file": "^1.1.0",
    "loader-runner": "^2.3.0",
    "longest": "^1.0.1",
    "micromatch": "^2.3.11",
    "memory-fs": "^0.4.1",
    "minimalistic-assert": "^1.0.0",
    "miller-rabin": "^4.0.0",
    "minimalistic-crypto-utils": "^1.0.1",
    "minimatch": "^3.0.4",
    "mkdirp": "^0.5.1",
    "minimist": "^0.0.8",
    "node-libs-browser": "^2.0.0",
    "normalize-path": "^2.1.1",
    "object.omit": "^2.0.1",
    "number-is-nan": "^1.0.1",
    "os-browserify": "^0.2.1",
    "os-locale": "^1.4.0",
    "normalize-package-data": "^2.3.8",
    "pako": "^0.2.9",
    "parse-asn1": "^5.1.0",
    "parse-glob": "^3.0.4",
    "parse-json": "^2.2.0",
    "path-browserify": "^0.0.0",
    "path-exists": "^2.1.0",
    "path-type": "^1.1.0",
    "pbkdf2": "^3.0.12",
    "pify": "^2.3.0",
    "path-is-absolute": "^1.0.1",
    "pinkie": "^2.0.4",
    "pinkie-promise": "^2.0.1",
    "preserve": "^0.2.0",
    "process": "^0.11.10",
    "process-nextick-args": "^1.0.7",
    "prr": "^0.0.0",
    "public-encrypt": "^4.0.0",
    "punycode": "^1.4.1",
    "querystring": "^0.2.0",
    "querystring-es3": "^0.2.1",
    "randomatic": "^1.1.7",
    "randombytes": "^2.0.5",
    "read-pkg": "^1.1.0",
    "read-pkg-up": "^1.0.1",
    "readdirp": "^2.1.0",
    "regex-cache": "^0.4.3",
    "repeat-element": "^1.1.2",
    "repeat-string": "^1.6.1",
    "require-directory": "^2.1.1",
    "right-align": "^0.1.3",
    "require-main-filename": "^1.0.1",
    "remove-trailing-separator": "^1.0.2",
    "safe-buffer": "^5.1.0",
    "ripemd160": "^2.0.1",
    "semver": "^5.3.0",
    "set-immediate-shim": "^1.0.1",
    "set-blocking": "^2.0.0",
    "setimmediate": "^1.0.5",
    "sha.js": "^2.4.8",
    "source-list-map": "^1.1.2",
    "spdx-correct": "^1.0.2",
    "spdx-license-ids": "^1.2.2",
    "stream-browserify": "^2.0.1",
    "spdx-expression-parse": "^1.0.4",
    "stream-http": "^2.7.1",
    "string-width": "^1.0.2",
    "strip-bom": "^2.0.0",
    "supports-color": "^3.2.3",
    "timers-browserify": "^2.0.2",
    "tapable": "^0.2.6",
    "to-arraybuffer": "^1.0.1",
    "tty-browserify": "^0.0.0",
    "uglify-to-browserify": "^1.0.2",
    "util": "^0.10.3",
    "url": "^0.11.0",
    "validate-npm-package-license": "^3.0.1",
    "util-deprecate": "^1.0.2",
    "vm-browserify": "^0.0.4",
    "watchpack": "^1.3.1",
    "webpack-sources": "^0.2.3",
    "webpack": "^2.6.1",
    "which-module": "^1.0.0",
    "window-size": "^0.1.0",
    "wordwrap": "^0.0.2",
    "wrap-ansi": "^2.1.0",
    "xtend": "^4.0.1",
    "y18n": "^3.2.1",
    "yargs": "^6.6.0",
    "yargs-parser": "^4.2.1"
  },
  "description": ""
}

webpack.config.js

var htmlWebpackPlugin =  require('html-webpack-plugin');
var path = require('path');

module.exports = {
    entry:{
        main:"./src/app.js",
    } ,
    output:{
        path:__dirname+'/dist',
        filename:'js/[name].bundle.js',
        //publicPath:'http://hotdeals.com/'
    },
    module:{
        loaders:[
            {
                test: /\.js$/,
                loader: 'babel-loader',
                include: path.resolve(__dirname,'src'),
                exclude: path.resolve(__dirname,'node_modules'),
                query:{
                    presets:["es2015"]
                }
             },{
                 test:/\.html/,
                 loader:'html-loader'
             },
             {
                 test:/\.css$/,
                 loader: [
                  'style-loader',
                  { loader: 'css-loader', options: { importLoaders: 1 } },
                  'postcss-loader'
                ]
             },{
                 test:/\.less$/,
                 loader:'style-loader!css-loader!postcss-loader!less-loader'
             },
             {
                 test:/\.(jpe?g|png|gif|svg)$/i,
                 loaders:[
                     'file-loader?limit=200&name=assets/[name]-[hash:5].[ext]',
                     {
                        loader: 'image-webpack-loader',
                        query: {
                          progressive: true,
                          optimizationLevel: 7,
                          interlaced: false,
                          pngquant: {
                            quality: '65-90',
                            speed: 4
                          }
                        }
                    }
                 ],
             },
        ]

    },

    plugins:[
        new htmlWebpackPlugin({
            filename:'index.html',
            template:'index.html',
            inject:'body',
            title:'home page',
        }),
    ]
} 

postcss.config.js(webpack2.0 prefixes with css to see the official website better)

module.exports = {
  plugins: {
    'autoprefixer': {},
  }
}

 

Project file:

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>
    <img src="src/assets/songzhixiao.jpeg" alt="">
    <div id="app"></div>
    <!-- I am a line comment -->
</body>
</html>

app.js

import './css/common.css';
import Layer from './components/layer/layer.js';


const App = function(){
    var dom = document.getElementById('app');
    var lay = new Layer();
    dom.innerHTML=lay.tpl;
}


new App();

 

 layer.js

import './layer.less'
import tpl from './layer.html'

function layer(){
    return {
        name:'layer',
        tpl: tpl
    }
}

export default layer;

Posted by changeback on Sat, 22 Jun 2019 12:13:33 -0700