关于webpack搭建工程,很早之前也简单弄过,在此整理,存档简单记录一份。
一、初始化webpack项目
1、新建一个项目目录这里就叫webpack,然后cd webpack 用npm init初始化
2、安装webpack
npm i webpack --save-dev npm i webpack-cli --save-dev因为4.x的版本把cli分离出来了,所以必需安装webpack-cli,安装后,现在的package.json的代码如下
{ "name": "vue-webpack", "version": "1.0.0", "description": "webpack+vue搭建工程配置项目测试", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "laoyuan", "license": "ISC", "devDependencies": { "webpack": "^4.30.0", "webpack-cli": "^3.3.1" } }3、新建工程目录和文件
在这里,先简单建好一些目录和文件,我们先在main.js随便写点东西
function test(){ console.log("app") }项目如图所示
二、新建webpack.config.js配置文件
配置文件需要放在项目的根目录下,名字建议就叫webpack.config.js。
这里我们先简单配置一下
const path = require("path"); const config = { entry: './src/main.js', output:{ path: path.resolve(__dirname, './dist'), publicPath: '/dist/', filename: 'my-bundle.js' } } module.exports = config;配置的官方文档:https://www.webpackjs.com/concepts/configuration/
三、修改 package.json的配置
我们在webpack4 之前,写一个项目或者用vue-cli2.0,配置有两种类型的配置文件:
webpack.dev.conf.js 开发环境的
webpack.prod.conf.js 生产环境的
而 webpack4 的 mode 给出了两种配置:development 和 production。
所以我们把package.json 中的 scripts 修改为:
"scripts": { "dev": "webpack --mode development", "build": "webpack --mode production" }我们分别执行 npm run dev和npm run build,如图所示
我们从图中可以看出:npm run dev 打包的是未压缩的代码,而 npm run build 是压缩后的代码。
生产模式下:启用了代码压缩、作用域提升等各种优化
开发模式下:针对速度进行了优化
此时,我们项目里就多了一个dist目录,就是我们打包后的代码存放目录。如图所示,main.js的代码也已打包到my-bundle.js里了。
四、 为项目安装babel、loader和相关的插件
1、安装babel 转换 ES6 代码
我们用babel转换ES6代码,需要安装一系列的依赖
npm i babel-core babel-loader babel-preset-env --save-devbabel-core 作用是把 js 代码分析成 ast ,方便各个插件分析语法进行相应的处理。
babel-loader 用于将 ES6 及以上版本转译至 ES5
babel-preset-env 用于将 Javascript ES6 代码编译为 ES5
上面命令安装完成后版本
"babel-core": "^6.26.3", "babel-loader": "^8.0.5", "babel-preset-env": "^1.7.0"我们需使用 babel-polyfill 解决兼容性问题
npm i babel-polyfill babel-plugin-transform-runtime --save-dev然后在我们的根目录下新建一个.babelrc文件,配置如下
{ "presets": [ "env" ], "plugins": [ "transform-runtime" ] }修改webpack.config.js配置为
const path = require("path"); const config = { entry: './src/main.js', output:{ path: path.resolve(__dirname, './dist'), publicPath: '/dist/', filename: 'my-bundle.js' }, module: { rules:[ { test: /\.js$/, exclude: /node_modules/, use: { loader: "babel-loader" } } ] } } module.exports = config;
在执行npm run dev,发现报错了,只能改一下版本了。
npm i babel-loader@7 –save-dev
然后成功了。
当然我们也可以在webpack.config.js配置,修改为
{ test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['env'], plugins: ['transform-runtime'] } } }
这样我们来运行一下,npm run dev,如图所示:
参考文档:https://www.webpackjs.com/loaders/babel-loader/
2、安装处理样式资源的相关loader和依赖
这里选择的是less,sass, styus配置类似的,因为我们这里是vue项目,我们用vue-style-loader
npm i css-loader vue-style-loader less-loader --save-dev
文档:https://www.webpackjs.com/loaders/less-loader/
webpack.config.js中的配置如下
{ test: /\.css$/, use: [ { loader: "vue-style-loader" }, { loader: "css-loader" } ] }, { test: /\.less$/, use: [ { loader: "vue-style-loader" }, { loader: "css-loader" }, { loader: "less-loader" } ] }3、安装配置处理图片资源url-loader
npm i url-loader --save-dev
webpack.config.js中配置如下
{ test: /\.(png|jpg||jpeg|gif)$/, use: [ { loader: 'url-loader', options: { limit: 1024, name: '[name]-yuan.[ext]' } } ] }
4、css自动添加前缀,单独抽取css到独立文件
npm i postcss-loader mini-css-extract-plugin --save-dev因为这里webpack4.0以上的版本,所以使用mini-css-extract-plugin
postcss-loader 用于添加浏览器前缀,在这里,我们是在根目录下,新建 文件postcss.config.js, 配置代码如下
module.exports = { plugins: { autoprefixer: {} } }在webpack.config.js里引入mini-css-extract-plugin模块,然后写入plugins
plugins: [ new MiniCssExtractPlugin({ filename: "[name].css", chunkFilename: "[id].css" }) ]
到此,webpack.config.js代码如下:
const path = require("path"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const config = { entry: './src/main.js', output:{ path: path.resolve(__dirname, './dist'), publicPath: '/dist/', filename: 'my-bundle.js' }, module: { rules:[ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['env'], plugins: ['transform-runtime'] } } }, { test: /\.css$/, use: [ { loader: "vue-style-loader" }, { loader: "css-loader" } ] }, { test: /\.less$/, use: [ { loader: "vue-style-loader" }, { loader: "css-loader" }, { loader: "less-loader" } ] } ] }, plugins: [ new MiniCssExtractPlugin({ filename: "[name].css", chunkFilename: "[id].css" }) ] } module.exports = config;
5、复制并压缩html文件的相关插件html-webpack-plugin
html-webpack-plugin插件的作用是用来自动生成html页面,既可以生成单个页面又可以生成多个页面,并且在生成前你可以给它一堆的配置,它会按照你想要的生成方式去生成页面。
npm i html-webpack-plugin html-loader --save-dev
{ test: /\.html$/, use: [{ loader: "html-loader", options: { minimize: true } }] }
在webpack.config.js加入如下代码:
const HtmlWebPackPlugin = require("html-webpack-plugin"); new HtmlWebPackPlugin({ template: "./public/index.html", filename: "./index.html" })
我们先在项目里新建一个public/index.html的目录和文件
执行npm run dev,如下:
6、打包前自动清空dist目录文件插件 clean-webpack-plugin
webpack.config.js增加如下代码即可:
const CleanWebpackPlugin = require('clean-webpack-plugin'); new CleanWebpackPlugin(['dist'])
const path = require("path"); const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const HtmlWebPackPlugin = require("html-webpack-plugin"); const CleanWebpackPlugin = require('clean-webpack-plugin'); const config = { entry: './src/main.js', output:{ path: path.resolve(__dirname, './dist'), publicPath: '/dist/', filename: 'my-bundle.js' }, module: { rules:[ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['env'], plugins: ['transform-runtime'] } } }, { test: /\.css$/, use: [ { loader: "vue-style-loader" }, { loader: "css-loader" } ] }, { test: /\.less$/, use: [ { loader: "vue-style-loader" }, { loader: "css-loader" }, { loader: "less-loader" } ] }, { test: /\.html$/, use: [{ loader: "html-loader", options: { minimize: true } }] } ] }, plugins: [ new MiniCssExtractPlugin({ filename: "[name].css", chunkFilename: "[id].css" }), new HtmlWebPackPlugin({ template: "./public/index.html", filename: "./index.html" }), new CleanWebpackPlugin(['dist']) ] } module.exports = config;
继续内容请查看:vue+webpack4.x从零搭建工程配置(二)