ESM模块 --> webpack/vite --> 原始js代码
npm init -y
webpack webpack-cli(使用命令行运行webpack)npm i -D webpack
npm i -D webpack-cli
-D 表示在生产时使用
npx webpack
使用模块化时,在node / webpack 环境中js/json 后缀不需要写,会自动补全;但是原生js 代码需要写上,不然会出现文件找不到的情况。
webpack.config.jsmodule.exports = {
// output: {
// path: path.resolve(__dirname, 'dist'),
// filename: 'main.js'
// },
mode: "development" // 设置mode production:生产模式 development:开发模式
}
webpack 只会打包会执行的代码,只有定义但没被调用的变量或者函数等数据不会被打包
module.exports = {
entry: './src/index.js', // 入口文件 默认打包./src/index.js
// entry: "[./src/index.js, './src/index2.js']"
// entry:{
// a:"./src/index.js"
// b:"./src/index2.js"
// }
// 也可以打包多个文件
}
module.exports = {
output: {
path: path.resolve(__dirname, 'dist'), // 指定打包目录 必须是绝对路径
filename: 'main.js', // 指定打包文件名
// filename: "[name].js" name值得是上面的a,b
// filename: "[name]-[id]-[hash].js" 打包后的文件名上带有id ,hash值
clean: true // 自动清理打包目录(比如dist)
},
}
module.exports = {
module: {
// 一个规则只负责一个功能
rules: [
{
// 这个规则只负责打包css代码
// 匹配文件需要使用正则表达式
test: /\.css$/i, // 匹配以css结尾的文件
use: "css-loader"
},
{
// 这个规则负责打包和转换css代码
test: /\.css$/i, // 匹配以css结尾的文件
use: ["style-loader","css-loader"] // 注意书写顺序 loder 从后往前执行 这里需要安装依赖 npm i style-loader css-loader -D
},
{
// 引入图片
test: /\.(jpg|gif|png)/i,
type: "asset/resource" // 图片类型的资源不需要安装依赖
}
]
}
}
在打包文件时webpack会把一些不必要的函数以及变量省略,比如下面就将常量和自执行的函数省略部分:
省略前:
document.body.insertAdjacentHTML("beforeend","今天天气真不错,风才12级k/h1>" )
const a=10
const fn =()=>{
return "哈哈"
}
console.log(a)
console.log(fn())
document.body.onclick =()=>{
alert("你点我干嘛!")
}
省略后:
document.body.insertAdjacentHTML("beforeend","今天天气真不错,风才12级k/h1>" )
console.log(10)
console.log("哈哈")
document.body.onclick =()=>{
alert("你点我干嘛!")
}
注意:在低版本浏览器中不兼容箭头函数等其他的新特性,但是我们现在希望能够使用新的特性,我们可以采用折中的方案。依然使用新特性编写代码,但是代码编写完成时我们可以通过一些工具将新代码转换为旧代码。例如babel–将新JS语法转换为旧的js代码
babel用来转换代码,是一个loder。
使用时需要:
npm i -D babel-loader @babel/core @babel/preset-env
{
test: /\.(?:js|mjs|cjs)$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: [
['@babel/preset-env', { targets: "defaults" }]
]
}
}
}
指定兼容浏览器:
在package.json 文件中添加以下内容:
"browserlist": [
"defaults", // 默认配置
"ie 6-8" // 指定配置
]
插件 – 为webpack 扩展功能
html-webpack-plugin ------ 在打包代码后,自动在打包目录生成html页面
npm i -D html-webpack-plugin
plugins: [
new HtmlPlugin({
template: './src/index.html'
}),
]
插件和加载器区别:
加载器会对代码进行处理,插件只做辅助工作。
每次修改完代码之后都需要手动输入命令进行代码打包,以下两种方法可以改善这种情况。
npx webpack --watch
npm i -D webpack-dev-server
npx webpack serve
npx webpack serve (–open) 在浏览器中打开网页
注意:使用 npx webpack serve (–open) 时只会j将打包好的文件放在服务器上,自己本身的文件中是没有dist文件夹的。
开发模式(development)打包之后的代码可以进行调试,但是生产模式(production)下打包的代码不可调试。
// 开发时要使用的工具
devtool: "inline-source-map"
这样就达到执行打包后的代码,调试源码的效果。
npm i -D vite
直接在创建根目录下创建html文件,但是在引入js文件时必须表明type=“module”,因为此处使用的是ESM语法。
npx vite
出现一个网址地点,即所对应的index.html 1️⃣
打包代码:
npx vite build
注意:
打包完的代码不能直接在浏览器打开,需要通过网址/服务器进行访问(live server也不可以);或者通过2️⃣
npx vite preview
1️⃣处打开的是开发服务器,代码变化那么页面内容也会随之改变;
但是2️⃣处打开的是进行预览,页面不会随代码改变而改变,需要重新打包后才会有变化。
npm create vite
vanilla —> 原生js
vite的使用不需要配置loader去引入css等文件。
vite需要配置的地方:
浏览器对代码的兼容性
使用插件进行
同样的,在根目录下创建vite.config.js
npm add -D @vitejs/plugin-legacy
import legacy from '@vitejs/plugin-legacy'
import { defineConfig } from 'vite'
export default defineConfig({
plugins:[
legacy({
targets:['defaults','not IE 11']
})
]
})