本文由腾讯云+社区自动同步,原文地址 https://stackoverflow.club/article/introduce_to_webpack/
webpack 是一个模块打包器。webpack 的主要目标是将 JavaScript 文件打包在一起,打包后的文件用于在浏览器中使用
这里已经介绍得非常详细了,我就不再废话。
如果在已经成型的vue项目中,package.json
构建时使用vue-cli-service build
,那么我们重新使用webpack打包会有一些坑。(我在试图进行vue ssr时碰到了这个问题)
vue-style-loader
不要忘记在一些教程文章上对vue文件的rules只有vue-loader
, 如果vue文件中嵌入了<style>
标签,就会报错。
修改vue的rules如下:
{
test: /\.vue$/,
loader: 'vue-loader!vue-style-loader',
}
.js
文件要用babel
{
test: /\.js$/,
loader: 'babel-loader',
include: path.join(projectRoot, 'src'),
exclude: /node_modules/,
options: {
presets: ['@vue/babel-preset-app']
}
}
{
test: /\.less$/,
loader: "style-loader!css-loader!less-loader"
},
{
test: /\.css$/,
loader: "style-loader!css-loader"
},
{
test: /\.scss$/,
loader: "style-loader!css-loader!sass-loader"
}
其他如图片文件、字体文件配置见完整的配置文件。
一个完整的webpack.config.js
如下:
const path = require('path');
const projectRoot = path.resolve(__dirname, '.');
const { VueLoaderPlugin } = require('vue-loader')
module.exports = {
// 此处告知 server bundle 使用 Node 风格导出模块(Node-style exports)
target: 'node',
mode:'production',
entry: path.join(projectRoot, 'src/entry-server.js'),
output: {
libraryTarget: 'commonjs2',
path: path.join(projectRoot, 'dist'),
filename: 'bundle.server.js',
},
module: {
rules: [{
test: /\.vue$/,
loader: 'vue-loader!vue-style-loader',
},
{
test: /\.js$/,
loader: 'babel-loader',
include: path.join(projectRoot, 'src'),
exclude: /node_modules/,
options: {
presets: ['@vue/babel-preset-app']
}
},
{
test: /\.less$/,
loader: "style-loader!css-loader!less-loader"
},
{
test: /\.css$/,
loader: "style-loader!css-loader"
},
{
test: /\.scss$/,
loader: "style-loader!css-loader!sass-loader"
},
/*{
test: /\.styl$/,
loader: 'style-loader!css-loader!stylus-loader'
},
*/
{
test: /\.(jpg|png)$/,
loader: 'url-loader'
},
{
test: /\.(eot|svg|ttf|woff|woff2)\w*/,
loader: 'url-loader'
},
]
},
plugins: [
new VueLoaderPlugin()
],
resolve: {
extensions: ['.js', '.json', '.css', '.scss','.vue'],//添加在此的后缀所对应的文件可以省略后缀
alias: {
'vue$': 'vue/dist/vue.runtime.esm.js',
'@': path.resolve(path.join(projectRoot, 'src')),
},
modules: [
path.resolve(path.join(projectRoot, 'node_modules')),
path.resolve(path.join(projectRoot, 'src'))
],
}
}
import api from 'API/index'
vs
import api from 'api/index'
api
是本地的一个路径,要么用./api
引入,要么用API
引入
import api from 'API/index'
这里的api
是说,将API/index
导出的所有东西作为api
的attributes
,可以直接通过api.blabla
调用
vs
import {api} from 'API/index'
这里的api是值从API/index
中引入api
, 如果在源文件中没有定义,那么为undefined
.
参考:
webpack中文文档 ,讲解详细