grunt/gulp 的核心是 task
什么时候用grunt/gulp 呢?
所以grunt/gulp 和 webpack的区别
<!--查看自己的node版本,终端输入命令行 -->
node -v
npm install webpack@3.6.0 -g
cd 对应的目录路径
npm install webpack@3.6.0 --save-dev
webpack ./src/main.js ./dist/bundle.js
<!-- 这段代码的意思是将src目录下的main.js和其导入的所有模块文件, 打包到dist目录下的一个叫bundle.js的文件中, 如果没有这个文件, 则会自动创建该文件 -->
使用打包后的文件
具体代码如下
// main.js的代码
// 1. 使用CommonJS规范 导入信息
const {sum, mul} = require("./mathUtils.js");
console.log(sum(10,20));
console.log(mul(10,20));
// 2. 使用ES6规范 导入信息
import {name, age, height} from "./info.js"
console.log(name);
console.log(age);
console.log(height);
// 使用webpack 打包模块
// 终端命令行输入 webpack 路径1 路径2
// 路径1 为想要打包的模块main 代码
// 路径2 为目标的js
// 例如 webpack ./src/main.js ./dist/bundle.js
// mathUtils.js 的代码
// 1. 使用CommonJS规范
function sum(num1, num2) {
return num1 + num2;
}
function mul(num1, num2) {
return num1 * num2;
}
// CommonJS规范导出信息
module.exports = {sum, mul};
// info.js 的代码
// 2. 使用ES6 规范导出信息
export const name = "xiaoLam";
export const age = 18;
export const height = 1.88;
<!-- index.html 的代码 -->
<body>
<script src="./dist/bundle.js"></script>
</body>
// webpack.config.js 的代码
const path = require("path");
// 使用CommonJS规范书写
module.exports = {
// 编写入口
entry : "./src/main.js",
// 编写出口, output 是一个对象, 对象包含两个属性, path 路径 和fliename 文件名, 其中path路径必须是绝对路径
// path绝对路径, 借助了node中的内置模块 path 的resolve方法 这个方法是用来拼接路径的
output : {
path : path.resolve(__dirname,"dist"), // __dirname 指的是当前文件的绝对路径
filename : "bundle.js" // 填写需要保存为的文件名
}
}
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
// 下面这个就是自定义的执行脚本
// 这句话的意思是 在命令行中输入 npm run build 的时候就会执行对应的代码
"build" : "webpack"
},
package.json中的scripts脚本在执行时, 会按照一定的顺序寻找命令对应的位置
执行build指令
第一步: npm局部安装css-loader和style-loader
第二步: 在入口js文件中编写css文件依赖 require=(“css文件的路径”)
第三步: 在webpack.config.js 的module关键字下进行配置
注意点:
<!-- 局部安装css-loader和 style-loader 命令行输入-->
npm install css-loader@需要的版本号 --save-dev
npm install style-loader@需要的版本号 --save-dev
// 在入口的js文件中编写css文件依赖
require = ("css文件的路径") // 不需要用变量去接收这个css文件, 只需要让js文件依赖这个css文件就行, 实际上就是让css文件与项目有了联系
// 在webpack.config.js 中的module关键字中编写配置
// 可以在webpack官网中查阅各个loader的用法
module.exports = {
module : {
rules: [
{
// 这个test的作用为导入以 .css结尾的文件
test: /\.css$/,
// 这里注意了, webpack在读取使用的loader的过程中,是按照从右向左的顺序读取的。
// 所以是先执行css-loader 再执行 style-loader 顺序不能写错
use: [ 'style-loader', 'css-loader' ]
}
]
}
}
// 这里是main.js文件中新增的代码
// 4. 在这里依赖一下less文件, 让less文件与项目有关系
require("./css/special.less")
// 为了可以看到效果, 给页面中填写一些文字
document.writeln("<h2>你好你好</h2>")
// 这里是webpack.config.js 中的修改后的module对象, 其实就是按照官方文档复制粘贴就行
module: {
rules: [
{
test: /\.css$/,
// 这里注意了, webpack在读取使用的loader的过程中,是按照从右向左的顺序读取的。
// 所以是先执行css-loader 再执行 style-loader 顺序不能写错
use: [ 'style-loader', 'css-loader' ]
},
{
test: /\.less$/,
use: [{
loader: "style-loader" // creates style nodes from JS strings
}, {
loader: "css-loader" // translates CSS into CommonJS
}, {
loader: "less-loader" // compiles Less to CSS
}]
}
]
}
/* 这里是css中引入的两张图片 */
body {
/* background: pink; */
/* 这是一张小于limit 大小的图片 */
/* background: url(../img/OIP.jfif) */
/* 这是一张大于limit 大小的图片 */
background: url(../img/sunlogo.jpg);
}
/* 这里是webpack.config.js 代码 */
/* 引用内置的path模块 */
const path = require("path");
// 使用CommonJS规范书写
module.exports = {
// 编写入口
entry : "./src/main.js",
// 编写出口, output 是一个对象, 对象包含两个属性, path 路径 和fliename 文件名, 其中path路径必须是绝对路径
// path绝对路径, 借助了node中的内置模块 path 的resolve方法
output : {
path : path.resolve(__dirname,"dist"),
filename : "bundle.js", // 填写需要保存为的文件名
// 设置publicPath, 让导出的每一个url地址在开头都添加上一个前缀地址
publicPath: "dist/"
},
// 引入css文件需要局部安装 css-loader 和 style-loader
module: {
rules: [
{
test: /\.css$/,
// 这里注意了, webpack在读取使用的loader的过程中,是按照从右向左的顺序读取的。
// 所以是先执行css-loader 再执行 style-loader 顺序不能写错
use: [ 'style-loader', 'css-loader' ]
},
{
test: /\.less$/,
use: [{
loader: "style-loader" // creates style nodes from JS strings
}, {
loader: "css-loader" // translates CSS into CommonJS
}, {
loader: "less-loader" // compiles Less to CSS
}]
},
{
test: /\.(png|jpg|gif|jpeg)$/,
use: [
{
loader: 'url-loader',
options: {
// 设置limit 限制图片的大小, 单位是B, 一般设置位8Kb,
limit: 16000,
// 设置name属性, 来设置导出的图片名字
name : "img/[name].[hash:8].[ext]"
}
}
]
}
]
}
}
{
// 这句是匹配所有.js结尾的文件
test: /\.js$/,
// 这句是表示除了 node_modules|bower_components 文件夹内的文件
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
// 这里是转换位 ES5代码 的意思
presets: ['es2015']
}
}
}
<!-- 在当前项目文件夹下, 终端输入命令行安装vue -->
npm install vue --save
// 在需要使用vue的js文件中的js代码
// 5. 使用Vue
import Vue from "vue";
const app = new Vue({
el : "#app",
data : {
message : "你好你好,我是Vue"
}
})
<body>
<div id="app">
<h2>{{message}}</h2>
</div>
<script src="./dist/bundle.js"></script>
</body>
// 这里时webpack.config.js中配置Vue的别名
module.exports = {
// ...
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js' // 用 webpack 1 时需用 'vue/dist/vue.common.js'
}
}
}
// 5. 使用Vue
import Vue from "vue";
new Vue({
el : "#app",
// 这个template中的模板,在Vue编译的时候,会替换el绑定的标签
template: `
<div>
<h2>{{message}}</h2>
<button>按钮</button>
<h2>{{name}}</h2>
</div>`,
data : {
message : "你好你好,我是Vue",
name : "xiaoLam"
}
})
export default {
template : `
<div>
<h2>{{message}}</h2>
<button>按钮</button>
<h2>{{name}}</h2>
</div>`,
data() {
return {
message : "你好你好,我是Vue",
name : "xiaoLam"
}
}
}
// 在main中导入上面的js文件
import test from "./vue/test.js"
<!-- 再项目文件目录下, 命令行输入以下代码, 安装模块 -->
npm install --save-dev vue-loader vue-template-compiler
// 这是.vue文件
// template标签内编写组件模板
<template>
<div>
<h2 class="title">{{ message }}</h2>
<button @click="btnClick">按钮</button>
<h2>{{ name }}</h2>
<test2></test2>
</div>
</template>
<script>
// script标签内编写组件构造器, 如果有其他依赖的模块, 也可以用import导入其他的模块
import test2 from "./Test2.vue";
export default {
name: "test",
data() {
return {
message: "你好你好,我是Vue",
name: "xiaoLam",
};
},
methods: {
btnClick() {
console.log("我被点击了");
},
},
components: {
test2,
},
};
</script>
<style scoped>
/* style标签内编写样式 */
.title {
color: pink;
}
</style>
// 最后在main.js中导入模块
// 并且在Vue实例的components中注册, 这样就可以在Vue实例中的template中使用该组件模块了
import test from "./vue/Test.vue"
new Vue({
el : "#app",
template: `<test></test>`,
components : {
test
}
})
什么时plugin
loader和plugin的区别
plugin的使用过程:
// 引用webpack内置的模块
const webpack = require("webpack")
module.exports = {
// ...
// 在plugins中编写版权plugin
plugins : [
new webpack.BannerPlugin("最终版权归xiaoLam所有")
]
}
目前, 我们的index.html文件时存放在项目的根目录中的
HtmlWebpackPlugin插件有什么用?
htmlwebpackplugin插件的使用
<!--在当前项目目录下命令行输入 -->
npm install html-webpack-plugin --save-dev
// 配置webpack.config.js 文件
// 引入webpack中的html-webpack-plugin模块
const htmlwebpackplugin = require("html-webpack-plugin");
output : {
path : path.resolve(__dirname,"dist"),
filename : "bundle.js", // 填写需要保存为的文件名
// 设置publicPath, 让导出的每一个url地址在开头都添加上一个前缀地址
// 在将index.html也一起打包到dist文件夹中的时候, 这句代码就要去掉了 把它注释掉
// publicPath: "dist/"
},
plugins : [
new webpack.BannerPlugin("最终版权归xiaoLam所有"),
new htmlwebpackplugin({
// 给htmlwebpackplugin实例添加一个对象, 对象里面包含template,值为html模板的路径
template : "./index.html"
})
]
<!-- 在当前项目根目录下, 命令行输入 -->
npm install uglifyjs-webpack-plugin@1.1.1 --save-dev
// 在webpack.config.js 中进行配置
// 引入模块
const uglifyjswebpackplugin = requrie("uglifyjs-webpack-plugin");
// 在plugins中使用该模块
module.exports = {
// ...
plugins : [
// ...
new uglifyjswebpackplugin();
]
}
<!-- 在当前项目根目录下 命令行输入 -->
npm install webpack-dev-server@2.9.1 --save-dev
// 配置webpack.config.js
module.exports = {
// ...
devServer : {
// 指定建立本地服务器的文件夹
contentBase : "./dist",
// 指定是否进行实时刷新页面
inline : true
}
}
// 配置package.json文件中的 scripts脚本属性
"scripts": {
// ...
// 配置好后, 在命令行输入 npm run dev 就可以运行本地服务器了
// --open是指, 能够在运行本地服务器的同时打开浏览器
"dev" : "webpack-dev-server --open"
}
<!-- 在当前项目根目录下, 命令行输入 -->
npm install webpack-merge@4.1.5 --save-dev
// 这是base.config.js 中的代码
// 其余的代码不变, 只保留公共的部分
module.exports = {
// ...
output : {
// 修改了path
path : path.resolve(__dirname,"../dist"),
filename : "bundle.js", // 填写需要保存为的文件名
}
// 这是prod.config.js的代码
// 将只在打包时需要的配置抽取到这里
// 引入压缩js的webpack-plugin的模块
const uglifyjswebpackplugin = require("uglifyjs-webpack-plugin");
// 引入webpack-merge 配置文件合并模块
const webpackmerge = require("webpack-merge")
// 引入base基本配置文件
const baseConfig = require("./base.config.js")
// 使用CommonJS规范书写
module.exports = webpackmerge(baseConfig, {
plugins : [
new uglifyjswebpackplugin()
]
})
// 这是dev.config.js的代码
// 将开发时需要的配置抽取到这里
// 引入配置文件合并模块
const webpackmerge = require("webpack-merge");
// 引入base基本配置文件
const baseConfig = require("./base.config.js");
// 使用CommonJS规范书写
module.exports = webpackmerge(baseConfig, {
devServer : {
// 指定建立本地服务器的文件夹
contentBase : "./dist",
// 指定是否进行实时刷新页面
inline : true
}
})
// 这里时package.json的代码
// 修改scripts
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
// --config 可以将默认使用的webpack.config.js配置文件修改为自定义的配置文件
"build": "webpack --config ./build/prod.config.js",
"dev": "webpack-dev-server --open --config ./build/dev.config.js"
}