webpack详细教程

一、前端自动化构建工具是什么/有什么用

https://www.jianshu.com/p/e290f9f53b7e
https://blog.csdn.net/wind_ghoul/article/details/79099322
https://www.imooc.com/article/66984
https://www.jianshu.com/p/b85c52360b83

二、webpack3安装教程

参考链接(版本过老,有许多需要改进的地方):https://www.jianshu.com/p/42e11515c10f

新建项目文件夹,例如D:\work\webpack_test

先确保安装好了npm 和 node ,然后用管理员权限运行CMD,进入项目文件夹目录,

输入命令全局安装webpack(把-g改成--save可以局部安装,慢的话可以用cnpm:https://www.cnblogs.com/wenjunwei/p/10078460.html)


npm install webpack@4 -g

npm install webpack-cli -g

windows可能会出现fsevents@^1.2.7报错,但是可忽略:https://blog.csdn.net/Fabulous1111/article/details/79388841

然后建立package.json,一直回车默认就可以了

npm init

然后建立如下的目录结构,

image

其中app放项目源码,node_modules放用到的工具包之类的(全局安装的webpack暂时还没有这个文件夹,等打包过后就会自动生成了),public放页面文件以及到时候打包好的JS文件,其中node_modules和package是自动生成的,其他的文件代码如下


// Greeter.js

module.exports = function() {

  var greet = document.createElement('div');

  greet.textContent = "Hi there and greetings!";

  return greet;

};

//main.js

const greeter = require('./Greeter.js');

document.querySelector("#root").appendChild(greeter());








  

    

    Webpack Sample Project

  

  

    

可见有两个JS文件,然后index.html只引用了bundle.js一个JS文件,所以我们就是要把前两个JS文件打包成一个JS文件(起减少请求、优化性能、提高速度的作用,文件量大的时候尤其如此)

使用webpack指令就可以完成打包

全局安装了的话,在项目文件夹直接使用:

webpack app\main.js -o public\bundle.js

局部安装的话要做该文件夹使用:

node_modules\.bin\webpack app\main.js -o public\bundle.js

打包成功,没有报错,index.html打开也正常。那么基本上说明安装成功了。

【可能遇到的问题:

---windows下的文件路径记得是用反斜杠 \

---如果打包成功,index.html浏览器显示失败,可以打开浏览器的console看看是不是权限不足,例如index.html在C盘的情况下

---想用回低版本

版本兼容性:https://blog.csdn.net/qq_27300101/article/details/80932670

低版本安装教程:https://blog.csdn.net/wanxue0804/article/details/79427332

---WARNING:The 'mode' option has not been set:https://www.jianshu.com/p/d71b27d0dfb5

---package.json文件:https://www.jianshu.com/p/b3d86ddfd555

三、使用教程

入门教程(有点过时了,要结合评论一起看):https://www.jianshu.com/p/42e11515c10f

官方文档:https://webpack.docschina.org/concepts/

1.命令简化

根目录新建webpack.config.js

module.exports = {

  entry:  __dirname + "/app/main.js",//已多次提及的唯一入口文件

  output: {

    path: __dirname + "/public",//打包后的文件存放的地方

    filename: "bundle.js"//打包后输出文件的文件名

  }

}

有了这个配置之后,再打包文件,只需在终端里运行webpack(非全局安装需使用node_modules/.bin/webpack)命令就可以了,这条命令会自动引用webpack.config.js文件中的配置选项

还有一种常用的方法:修改根目录package.json,主要是在"scripts"中加入指令名字,

(npm的start命令是一个特殊的脚本名称,其特殊性表现在,在命令行中使用npm start就可以执行其对于的命令,如果对应的此脚本名称不是start,想要在命令行中运行时,需要这样用npm run {script name}如npm run build)

修改后类似于

{

  "name": "webpack_1",

  "version": "1.0.0",

  "description": "",

  "main": "index.js",

  "scripts": {

    "test": "echo \"Error: no test specified\" && exit 1",

    "start": "webpack"

  },

  "author": "",

  "license": "ISC"

}

然后使用命令 npm start 同样也可以执行打包操作了

2.使用webpack构建本地服务器

https://www.cnblogs.com/xuehaoyue/p/6410095.html

3.Loaders能调用外部的脚本或工具,实现对不同格式的文件的处理

3.1 babel编译器

babel可以帮助你编译ES6、ES7、React框架的JSX等浏览器不完全支持的语法,转化为浏览器可以执行的JS,用了babel就可以在开发中使用更加先进高效的JS

按这些命令安装所需工具

cnpm install -D webpack@4

cnpm install babel-core --save

cnpm install babel-loader@7 --save

cnpm install babel-preset-env --save

cnpm install babel-preset-react --save

cnpm install react --save

cnpm install react-dom --save
//否则会类似以下的错误:

( Error: Can't resolve 'babel-loader' in 'D:\work\webpack_test')

(Module not found: Error: Can't resolve 'react' in 'D:\work\webpack_test\app')

(Error: Couldn't find preset "react" relative to directory "D:\\work\\webpack_test\\app")

(Error: Couldn't find preset "env" relative to directory "D:\\work\\webpack_test\\app")

这类问题的解决方法:安装没找到的包或依赖,cnpm install xxx -save

(Couldn't find webpack@2 | 3 | 4)

这类问题是需要特定版本的工具:那就下载相应版本的工具 cnpm install -D webpack@4

然后修改文件,使用ES6和React编写代码,webpack打包成浏览器可以执行的html。

先在app文件夹里面添加config.json

{

  "greetText": "Hi there and greetings from JSON!"

}

修改其他文件

module.exports = {

  entry:  __dirname + "/app/main.js",//已多次提及的唯一入口文件

  output: {

    path: __dirname + "/public",//打包后的文件存放的地方

    filename: "bundle.js"//打包后输出文件的文件名

  },

  module: {

        rules: [

            {

                test: /(\.jsx|\.js)$/,

                use: {

                    loader: "babel-loader",

                    options: {

                        presets: [

                            "env", "react"

                        ]

                    }

                },

                exclude: /node_modules/

            }

        ]

    },

}

//Greeter,js

import React, {Component} from 'react'

import config from './config.json';

class Greeter extends Component{

  render() {

    return (

      
{config.greetText}
); } } export default Greeter
// main.js

import React from 'react';

import {render} from 'react-dom';

import Greeter from './Greeter';

render(, document.getElementById('root'));

3.2CSS处理

3.2.1下载工具css-loader 和 style-loader

(css-loader使你能够使用类似@import 和 url(...)的方法实现 require()的功能,style-loader将所有的计算后的样式加入页面中,二者组合在一起使你能够把样式表嵌入webpack打包后的JS文件中。)

cnpm install --save-dev style-loader css-loader

修改webpack.config.js

module.exports = {

  entry:  __dirname + "/app/main.js",//已多次提及的唯一入口文件

  output: {

    path: __dirname + "/public",//打包后的文件存放的地方

    filename: "bundle.js"//打包后输出文件的文件名

  },

  module: {

        rules: [

            {

                test: /(\.jsx|\.js)$/,

                use: {

                    loader: "babel-loader",

                    options: {

                        presets: [

                            "env", "react"

                        ]

                    }

                },

                exclude: /node_modules/

            },

            {

                test: /\.css$/,

                use: [

                    {

                        loader: "style-loader"

                    }, {

                        loader: "css-loader"

                    }

                ]

            }

        ]

    },

}

在app文件夹里创建一个名字为"main.css"的文件

/* main.css */

html {

  box-sizing: border-box;

  -ms-text-size-adjust: 100%;

  -webkit-text-size-adjust: 100%;

}

*, *:before, *:after {

  box-sizing: inherit;

}

body {

  margin: 0;

  font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;

}

h1, h2, h3, h4, h5, h6, p, ul {

  margin: 0;

  padding: 0;

}

并引用到main.js中去

//main.js

import React from 'react';

import {render} from 'react-dom';

import Greeter from './Greeter';

import './main.css';//使用require导入css文件

render(, document.getElementById('root'));

webpack后就可以在浏览器看到效果了。(index.html没有引入css,而是把css嵌入到了js中去,体现模块化的思想)

3.2.2实战CSS模块化——CSS module

被称为CSS modules的技术意在把JS的模块化思想带入CSS中来,通过CSS模块,所有的类名,动画名默认都只作用于当前模块。Webpack对CSS模块化提供了非常好的支持,只需要在CSS loader中进行简单配置即可,然后就可以直接把CSS的类名传递到组件的代码中,这样做有效避免了全局污染。

先下载css-loader

cnpm install -D [email protected]

修改webpack.config.js

module.exports = {

  entry:  __dirname + "/app/main.js",//已多次提及的唯一入口文件

  output: {

    path: __dirname + "/public",//打包后的文件存放的地方

    filename: "bundle.js"//打包后输出文件的文件名

  },

  module: {

        rules: [

            {

                test: /(\.jsx|\.js)$/,

                use: {

                    loader: "babel-loader",

                    options: {

                        presets: [

                            "env", "react"

                        ]

                    }

                },

                exclude: /node_modules/

            },

            {

                test: /\.css$/,

                use: [

                    {

                        loader: "style-loader"

                    },

                    {

                        loader: "css-loader",

                        options: {

                            modules: true, // 指定启用css modules

                            localIdentName: '[name]__[local]--[hash:base64:5]' // 指定css的类名格式

                        }

                    }

                ]

            }

        ]

    },

}

在app文件夹下创建一个Greeter.css文件

/* Greeter.css */

.root {

  background-color: #eee;

  padding: 10px;

  border: 3px solid #ccc;

}

导入到Greeter.js中

import React, {Component} from 'react';

import config from './config.json';

import styles from './Greeter.css';//导入

class Greeter extends Component{

  render() {

    return (

      
//使用cssModule添加类名的方法 {config.greetText}
); } } export default Greeter

webpack后检查结果(可见class类名后面加入了hash值,避免了类名重复冲突)

3.2.3 CSS预处理器

sass

less

4.插件(Plugins)

...

5.vue

你可能感兴趣的:(webpack详细教程)