Webpack从零开始配置一个开放环境 首先准备: 安装好nodejs( 意味着可以使用npm )
开始配置之旅
全局安装 webpack_cli 以确保可以使用webpack指令(在项目中也要安装)
npm install webpack_cli -g (在项目中安装:npm install webpack_cli –save-dev)
新建一个文件夹,命名为use (路径最好不要有中文,会出什么bug我也不知道)
在use文件夹下打开命令行(在文件夹下按住shift键然后右击,选择在命令行打开)
在命令行输入下面命令:npm init ; 然后一直默认就行了。
完成以后会看到文件夹下多了一个package.json文件(这个文件可以存放我们安装的模块)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 { "name" : "y" , "version" : "1.0.0" , "description" : "" , "main" : "webpack.config.js" , "scripts" : { "test" : "echo \"Error: no test specified\" && exit 1" , "dev" : "webpack-dev-server" }, "author" : "" , "license" : "ISC" , "devDependencies" : { "babel-loader" : "^7.1.4" , "css-loader" : "^0.28.10" , "extract-text-webpack-plugin" : "^4.0.0-beta.0" , "html-webpack-plugin" : "^3.0.6" , "less" : "^3.0.1" , "less-loader" : "^4.1.0" , "style-loader" : "^0.20.3" , "vue" : "^2.5.13" , "webpack-dev-server" : "^3.1.1" }, "dependencies" : { "webpack" : "^4.1.1" , "webpack-cli" : "^2.0.11" } }
开始下载模块,我们先来下载webpack,和webpack_cli 模块
npm install webpack webpack_cli –save-dev
( –save 是下载到当前的目录,而后面的-dev是将模块同步到package.json文件里面 )
命令完成以后可以看到use文件夹下多了一个node_modules的文件夹,里面就是存放我们要使用的模块
在use文件夹下新建一个文件webpack.config.js,这个文件就是webpack的配置文件。
现在我们先来写下我们的开发目录吧
use—–> //项目目录
->dist //文件打包后的目录
->node_modules //存放要使用的插件的目录
src ——-> //我们的开发目录
->css //存放css
->img //存放图片的目录
->js //存放js的目录
->views //存放html的目录
—index.html //入口html
—index.js //入口js
—package.json
—webpack.config.js //webpack的配置文件
开始配置webpack.config.js
(主要是src下的入口文件index.js通过webpack打包到dist文件夹下)
// 引入模块 var path = require(‘path’); const webpack = require(“webpack”);
module.exports = {
1 2 3 4 5 6 7 8 9 10 11 // 页面入口文件,(html页面引入的唯一js文件) entry: "./src/index.js", // 对应输出项的配置 output: { // 入口文件要输出的最终位置 (要放绝对路径) path: path.normalize(__dirname+"/dist"), // 输出文件的名称 filename: "index.js", // 公共资源路径 publicPath: "" },
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 index.html: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <div class="a">webpack配置</div> <script src="../dist/index.js"></script> </body> </html>
index.js
package.json的配置中script里面按上面的展示的写
直接在命令行输入: npm run dev
运行完成以后,你会发现dist文件夹下多了一个index.html文件
上面的简单配置已经没有问题了,下面我们就来配置更多的模块。
babel-loader : 这个包允许使用bable和webpack进行转换的js文件
安装babel-loader 到项目: npm install babel-loader –save-dev
在js文件夹下新建conmon.js文件:
1 2 3 4 5 6 function showName (name ) { console .log(name); } module .exports = { showName : showName }
然后在index.js里面引入这个文件
1 2 3 4 const conmon = require ("./js/conmon.js" );conmon.showName("完成了关联" );
webpack.config.js配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 // 引入模块 var path = require('path'); const webpack = require("webpack"); module.exports = { // 页面入口文件,(html页面引入的唯一js文件) entry: "./src/index.js", // 对应输出项的配置 output: { // 入口文件要输出的最终位置 (要放绝对路径) path: path.normalize(__dirname+"/dist"), // 输出文件的名称 filename: "index.js", // 公共资源路径 publicPath: "" }, module: { rules: [ { test: /.js$/, // 要查找的以.js结尾的文件 exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹 use:['babel-loader'] // 使用的模块 }, ] }, }
打包以后,你会发现,conmon.js和index.js合并到了dist下的index下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1. style-loader : 通过注入一个<style>标签将css添加到DOM中。 一般是配合css-loader来使用的 2. css-loader : css-loader会像import/require()一样解释@import和url()并解析他们 下载到项目: num install style-loader css-loader --save-dev 在css文件夹下新建css文件index.css: ```css .a { width: 200px; height: 200px; background-color: #00ffff; color: #ffffff; font-size: 36px; text-align: center; }
在index.js引入:
1 2 3 4 5 6 7 const conmon = require ("./js/conmon.js" );require ("./css/index.css" );console .log("1234" );conmon.showName("完成了关联" );
webpack.config.js配置:
// 引入模块 var path = require(‘path’); const webpack = require(“webpack”);
module.exports = { // 页面入口文件,(html页面引入的唯一js文件) entry: “./src/index.js”, // 对应输出项的配置 output: { // 入口文件要输出的最终位置 (要放绝对路径) path: path.normalize(__dirname+”/dist”), // 输出文件的名称 filename: “index.js”, // 公共资源路径 publicPath: “” }, module: { rules: [ { test: /.js$/, // 要查找的以.js结尾的文件 exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹 use:[‘babel-loader’] // 使用的模块 }, // 将引入的css样式写入到标签的style属性中 { test: /.css$/, use: [‘style-loader’,’css-loader’] },
]
},
} 1 2 3 4 在index.html使用下样式,则会看到标签样式加上去了。
extract-text-webpack-plugin 插件:4)在打包过程中,把一类文本单独抽离出来
(在上面的打包css的时候,css是直接写入到标签的style属性里面,这明显是有点菜的做法,那么我们可以通过这个插件把require的css文件单独抽出来,外部引入)
安装: npm install extract-text-webpack-plugin@next –save-dev
这里 extract-text-webpack-plugin 必须安装最新版本。
Webpack 4.0 必须对应是 extract-text-webpack-plugin 4.0.0
1 2 3 4 5 // 引入模块 var path = require('path'); const webpack = require("webpack"); const ExtractTextPlugin = require("extract-text-webpack-plugin"); // 用于提取出 莫一类文件,单独生成文件,比如说单独抽离css const ExtractCSS = new ExtractTextPlugin("css/style_1.css");
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 module.exports = { // 页面入口文件,(html页面引入的唯一js文件) entry: "./src/index.js", // 对应输出项的配置 output: { // 入口文件要输出的最终位置 (要放绝对路径) path: path.normalize(__dirname+"/dist"), // 输出文件的名称 filename: "index.js", // 公共资源路径 publicPath: "" }, module: { rules: [ { test: /.js$/, // 要查找的以.js结尾的文件 exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹 use:['babel-loader'] // 使用的模块 }, // 将引入的css样式写入到标签的style属性中 // { // test: /.css$/, // use: ['style-loader','css-loader'] // }, // 用插件是的css单独抽离,外部引入 { test: /.css$/, use: ExtractCSS.extract({ fallback: "style-loader", // 加载程序; css被提取时,加载的插件 use: [ // 装入器; css提取出来以后,加载为css { loader: "css-loader", options: { minimize : true // 是否压缩 } } ] }) }, ] }, // 插件 plugins: [ ExtractCSS, // 输出css ], }
这样会生成一个css文件;但是,生成的文件不会动态自己添加到html代码中去,如果想要动态添加到代码,则需要下面的这个插件;
1 2 3 4 1. html-webpack-plugin : 插件简化了HTML文件的创建,以服务于您的bundle 安装: npm i html-webpack-plugin --save-dev
const HtmlPlugin = require(“html-webpack-plugin”); // 用于动态生成html,可以动态添加js和css的外部引入
1 2 3 4 5 6 7 // 引入模块 var path = require('path'); const webpack = require("webpack"); const ExtractTextPlugin = require("extract-text-webpack-plugin"); // 用于提取出 莫一类文件,单独生成文件,比如说单独抽离css const ExtractCSS = new ExtractTextPlugin("css/style_1.css"); const HtmlPlugin = require("html-webpack-plugin"); // 用于动态生成html,可以动态添加js和css的外部引入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 module.exports = { // 页面入口文件,(html页面引入的唯一js文件) entry: "./src/index.js", // 对应输出项的配置 output: { // 入口文件要输出的最终位置 (要放绝对路径) path: path.normalize(__dirname+"/dist"), // 输出文件的名称 filename: "index.js", // 公共资源路径 publicPath: "" }, module: { rules: [ { test: /.js$/, // 要查找的以.js结尾的文件 exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹 use:['babel-loader'] // 使用的模块 }, // 将引入的css样式写入到标签的style属性中 // { // test: /.css$/, // use: ['style-loader','css-loader'] // }, // 用插件是的css单独抽离,外部引入 { test: /.css$/, use: ExtractCSS.extract({ fallback: "style-loader", // 加载程序; css被提取时,加载的插件 use: [ // 装入器; css提取出来以后,加载为css { loader: "css-loader", options: { minimize : true // 是否压缩 } } ] }) }, ] }, // 插件 plugins: [ ExtractCSS, // 输出css new HtmlPlugin({ // 输出html template: "src/index.html" // 以src下的index.html为模板打包 }) ] }
上面的配置,不需要自己在html中引入css和js,他会自动在打包的时候,给html添加js和css并且编译到dist里面。
1 2 3 4 5 6 7 8 1. less-loader : less文件编译 npm install less-loader --save-dev ```js
1 2 3 4 5 6 7 8 // 引入模块 var path = require('path'); const webpack = require("webpack"); const ExtractTextPlugin = require("extract-text-webpack-plugin"); // 用于提取出 莫一类文件,单独生成文件,比如说单独抽离css const ExtractCSS = new ExtractTextPlugin("css/style_1.css"); const ExtractLESS = new ExtractTextPlugin("css/style_2.css"); const HtmlPlugin = require("html-webpack-plugin"); // 用于动态生成html,可以动态添加js和css的外部引入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 module.exports = { // 页面入口文件,(html页面引入的唯一js文件) entry: "./src/index.js", // 对应输出项的配置 output: { // 入口文件要输出的最终位置 (要放绝对路径) path: path.normalize(__dirname+"/dist"), // 输出文件的名称 filename: "index.js", // 公共资源路径 publicPath: "" }, module: { rules: [ { test: /.js$/, // 要查找的以.js结尾的文件 exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹 use:['babel-loader'] // 使用的模块 }, // 将引入的css样式写入到标签的style属性中 // { // test: /.css$/, // use: ['style-loader','css-loader'] // }, // 用插件是的css单独抽离,外部引入 { test: /.css$/, use: ExtractCSS.extract({ fallback: "style-loader", // 加载程序; css被提取时,加载的插件 use: [ // 装入器; css提取出来以后,加载为css { loader: "css-loader", options: { minimize : true // 是否压缩 } } ] }) }, // 使用less文件编译成css { test: /.less$/, use: ExtractLESS.extract({ fallback: "style-loader", use: [ {loader: "css-loader",options:{minimize: true}}, {loader:"less-loader"} ] }) } ] }, // 插件 plugins: [ ExtractCSS, // 输出css ExtractLESS, // 输出less转化为css new HtmlPlugin({ // 输出html template: "src/index.html" // 以src下的index.html为模板打包 }) ], }
配置好后,只要在index.js里面引入less文件即可
1 2 3 4 5 6 7 8 9 // 引入js文件 const conmon = require("./js/conmon.js"); // 引入css文件 require("./css/index.css"); // 引入less文件 require("./css/style.less"); console.log("1234"); conmon.showName("完成了关联");
然后运行打包,就会发现less文件就被编译成了style_2.css;
1 2 3 4 5 6 7 8 9 10 1. webpack-dev-server :使用带有动态重新加载的开发服务器的webpack。这应该只用于开发。 安装: npm i webpack-dev-server --save-dev 插件的介绍里面没有标明什么用法,所以去看了下webpack的文档,里面有个属性 devServer即是在安装 webpack-dev-server插件以后配置的。 配置如下:
// 引入模块 var path = require(‘path’); const webpack = require(“webpack”); const ExtractTextPlugin = require(“extract-text-webpack-plugin”); // 用于提取出 莫一类文件,单独生成文件,比如说单独抽离css const ExtractCSS = new ExtractTextPlugin(“css/style_1.css”); const ExtractLESS = new ExtractTextPlugin(“css/style_2.css”);
const HtmlPlugin = require(“html-webpack-plugin”); // 用于动态生成html,可以动态添加js和css的外部引入 module.exports = { // 页面入口文件,(html页面引入的唯一js文件) entry: “./src/index.js”, // 对应输出项的配置 output: { // 入口文件要输出的最终位置 (要放绝对路径) path: path.normalize(dirname+”/dist”), // 输出文件的名称 filename: “index.js”, // 公共资源路径 publicPath: “” }, module: { rules: [ { test: /.js$/, // 要查找的以.js结尾的文件 exclude: /(node_modules|bower_components)/, //排除不需要查找的文件夹 use:[‘babel-loader’] // 使用的模块 }, // 将引入的css样式写入到标签的style属性中 // { // test: /.css$/, // use: [‘style-loader’,’css-loader’] // }, // 用插件是的css单独抽离,外部引入 { test: /.css$/, use: ExtractCSS.extract({ fallback: “style-loader”, // 加载程序; css被提取时,加载的插件 use: [ // 装入器; css提取出来以后,加载为css { loader: “css-loader”, options: { minimize : true // 是否压缩 } } ] }) }, // 使用less文件编译成css { test: /.less$/, use: ExtractLESS.extract({ fallback: “style-loader”, use: [ {loader: “css-loader”,options:{minimize: true}}, {loader:”less-loader”} ] }) } ] }, // 插件 plugins: [ ExtractCSS, // 输出css ExtractLESS, // 输出less转化为css new HtmlPlugin({ // 输出html template: “src/index.html” // 以src下的index.html为模板打包 }) ], // 开启服务 devServer : { contentBase: path.join( dirname+”/dist”), // 告诉服务器从哪里提供内容 open: true, // 服务器是否自动打开浏览器 openPage: ‘index.html’, //打开浏览器是指定打开的文件 port: 8080, // 设置端口号 proxy: { // 设置代理服务器 “/api”: { target: “http://localhost:3000 “, // 当在页面中输入 /api的时候,相当于 http://localhost:3000 pathRewrite: { // 改写路径 “^/api”: “” } } }, } }1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 Package.json配置: 看script属性下的dev属性:webpack-dev-server ```json { "name": "y", "version": "1.0.0", "description": "", "main": "webpack.config.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "dev": "webpack-dev-server" }, "author": "", "license": "ISC", "devDependencies": { "babel-loader": "^7.1.4", "css-loader": "^0.28.10", "extract-text-webpack-plugin": "^4.0.0-beta.0", "html-webpack-plugin": "^3.0.6", "less": "^3.0.1", "less-loader": "^4.1.0", "style-loader": "^0.20.3", "vue": "^2.5.13", "webpack-dev-server": "^3.1.1" }, "dependencies": { "webpack": "^4.1.1", "webpack-cli": "^2.0.11" } }
然后配置好后,运行: npm run dev
则会自动开启服务器,当我们每次修改代码保存以后,会自动打包文件,并在我们的浏览器实时更新。
这样我们就把一个简单的开发环境搭建好了