04 webpack3配置从0到1搭建vue工程

一.webpack配置Vue工程

1.webpack配置文件拆分

2.vue-loader.config.js配置

vue-loader.config.js完整配置

// vue-loader的配置项非常多故单独抽离出来
// 根据不同的环境做不同的处理

const docsLoader = require.resolve('./doc-loader.js')

module.exports = (isDev) => {
  return {
    preserveWhitepace: true,  // 去掉vue template html中的空格
    // extractCSS: true, // 前面抽离css 发现vue的样式没有抽离出来 默认是不会单独抽离出来 设置true是可以抽离
    extractCSS: !isDev, //!isDev正式环境   把vue的css打包到单独的css文件中,提高首屏加载速度, 但其实不加也把vue中的css也打包进去了。。
    cssModules: { //针对vue文件css样式的类生成一个带路劲和名字的hash值
      localIdentName: '[path]-[name]-[hash:base64:8]',
      camelCase: true // 如.main-box 改成.mainBox的作用  javascript是不能使用这样的变量名main-box 故需要改成mainBox
    },
    // 常规Vue项目下以下配置基本不会使用
    // hotReload: false, // 热重载默认根据环境变量生成 production热重载关闭 development热关闭 修改template的内容  热重载的意思是不刷新浏览器改变页面
    // loaders: {// 自定义模块在.vue  <docs></docs> 作用是构建组件库的时候 写我们的文档如案例 
    //   'docs': 'docsLoader',
    // },
    // preLoader: {}, // 在解析js时 在bael-loader之前先用preLoader解析js 然后再由bael-loader解析
    // postLoader: {}, // 同理


  }
}

2.1 抽离vue 中的样式

const createVueLoaderOptions = require('./vue-loader.config')

module: {
    rules: [
      {
        test: /\.vue$/,  // .需要通过\转义
        loader: 'vue-loader', // 自动加载模块功能
        options: createVueLoaderOptions(isDev) //使用vue-loader.config.js
      }
    ]
  },

2.2 vue-style-loader  样式热更替(不刷新浏览器) 根据环境变量判断是否开启

rules: [
        {
          // test: /\.styl$/,  // 这样配置会有个错误Module parse failed: Unexpected character '#',使用下面配置处理
          test: /.styl(us)?$/,
          use: [
            // 'style-loader',
            'vue-style-loader', // 能监听到vue文件中的样式变化 然后热重载
            // 'css-loader',
            { // 不生效
              loader: 'css-loader',
              options: {
                modules: true,
                // 自定义生成的类名
                localIdentName: '[local]_[hash:base64:8]'
              }
            },
            {
              loader: 'postcss-loader', // 添加postcss.config.js , webkit前缀
              options: {
                souerMap: true, // 可直接使用前面的souerMap,提高编译效率
              }
            },
            'stylus-loader'  //stylus-loader解析后是css   webpack的loader 就是一层一层的往上传递
          ]
        },
      ]

2.3  每次打包删除dist 文件

"clean": "rimraf dist"

npm run clean

2.4 cssMoudles的作用是在当前组件才能调用使用,其他组件不能使用

好处是:不会有class命名空间的冲突,定位class的名称保密性还好, 比scope性能更好

 vue文件中使用:

配置:

cssModules: { //针对vue文件css样式的类生成一个带路劲和名字的hash值
      localIdentName: '[path]-[name]-[hash:base64:8]',
      camelCase: true // 如.main-box 改成.mainBox的作用  javascript是不能使用这样的变量名main-box 故需要改成mainBox
    },

使用:

<template>
  <header :class="$style.mainHeader"> // $style.mainHeader这样的写法
    <h1>Todo</h1>
    <!-- <h1 :class="$style.red">123</h1> -->
  </header>
</template>

类似于生成
<script>
computed: {
  $style() {
    return {
      mainHeader
    }
  }
}
</script>

<style lang="stylus" module> // moudle是必须的
.main-header{
  text-align center
  color: pink;
  h1{
    font-size 100px
    color rgba(175,47,47,0.4)
    font-weight 400
    margin 20px
  }
}
</style>

 jsx文件中使用:

配置:

module: {
      rules: [
        {
          // test: /\.styl$/,  // 这样配置会有个错误Module parse failed: Unexpected character '#',使用下面配置处理
          test: /.styl(us)?$/,
          use: [
            // 'style-loader',
            'vue-style-loader', // 能监听到vue文件中的样式变化 然后热重载
            // 'css-loader',
            { // 不生效
              loader: 'css-loader',
              options: {
                modules: true,
                // 自定义生成的类名
                localIdentName: '[local]_[hash:base64:8]'
              }
            },
            {
              loader: 'postcss-loader', // 添加postcss.config.js , webkit前缀
              options: {
                souerMap: true, // 可直接使用前面的souerMap,提高编译效率
              }
            },
            'stylus-loader'  //stylus-loader解析后是css   webpack的loader 就是一层一层的往上传递
          ]
        },
      ]
    },

 使用:

// cssmoudles不生效 请检查css-loader的版本
import className from "../assets/styles/footer.styl";

export default {
  data() {
    return {
      author: "cookie",
      list: [1, 2],
    };
  },
  render() {
    return (
      <div id={className.footer}>
        {/* <div id="footer"> <div id={className.footer}> */}
        <span>jsx 语法 {this.author}</span>
      </div>
    );
  },
};

效果图:

 3.eslit 配置

好处是:避免一些低级的错误,团队合作保持同种风格

3.1 安装依赖(我们使用最近流行的standard)

"eslint": "^4.16.0",
    "eslint-config-standard": "^11.0.0-beta.0",
    "eslint-plugin-html": "^4.0.1", //eslint不能识别vue中的<script>内的代码,故需按照这个
    "eslint-plugin-import": "^2.8.0",
    "eslint-plugin-node": "^5.2.1",
    "eslint-plugin-promise": "^3.6.0",
    "eslint-plugin-standard": "^3.0.1",
    "eslint-loader": "^1.9.0",

 3.2 配置与使用

配置:新建.eslintrc

{
  "extends": "standard",
  "plugins": ["html"],
  "rules": {
    "no-new": "off",
    "no-unused-vars": "off"
  }
}

 packjson中配置:

"lint": "eslint --ext .js --ext .jsx --ext .vue client/", //--ext检测那些后缀名的文件,及那个文件夹
"lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue client/ practice/", // eslit 修复



使用npm run lint

 3.3  改了代码马上做eslint的检查

我们希望改了代码马上做eslint的检查,能马上定位问题,也能规范我们写的代码

1.在eslint.src配置

"parser": "babel-eslint", // babel处理的语法可能对eslint有影响

 2.在webpack.config.base.js配置

rules: [
      {
        test: /\.(vue|js|jsx)$/,
        loader: 'eslint-loader',
        exclude: /node_modules/,
        enforce: 'pre' //elist只是代码检测,当然是不能默认处理.vue文件 预处理在vue-loader之前处理,即预处理当然也有后处理
      }
    ]

3.4 editorconfig 规范不同的编辑器的默认配置

需要在vscode中安装插件 EditorConfig for VS Code

在编辑项目使用相同的配置,新建.editorconfig

root = true // 这个项目读到这层就可以了 不再往上层目录搜索

[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true // 文件最后自动最后添加空行
trim_trailing_whitespace = true // 删除末尾的空格

 4.项目中git配置

git commit之前自动进行eslint检查代码,不通过eslit检查则不会提交代码

1.一定先要git init初始化代码仓库

2. npm i  husky -D

packjson中配置:"precommit": "npm run lint",  //检测代码  "npm run lint-fix"  修复代码

不通过代码检查则不会提交

 以上的配置都是一劳永逸的希望在你们的项目都先配置好

5. 运行项目

5.1 index.js 程序入口修改:

// const root = document.createElement('div')
// document.body.appendChild(root) // root 节点需要创建

// new Vue({
//   render: (h) => h(App) // h 是vue中的createApp
// }).$mount(root) // $mount把我们的app 挂载到我们的html的root节点下

new Vue({
  render: (h) => h(App) // h 是vue中的createApp
}).$mount('#root') //就不需要向上面一样创建节点root 获取template.html中的root节点,并且新建template.html,在webpack配置

5.2 新建template.html

<body>
  <div id="root"></div>
</body>

5.3 webpack.config.client.js 配置template.html

  new HTMLPlugin({
    template: path.join(__dirname, "./template.html"), // 指定模板页面 以根据指定页面生成内存中的页面
    filename: "index.html" // 指定生成的内存中的页面的名称
  }),

源码链接: https://gitee.com/zhangcookie/webpack4_vue_ssr_todo-list.git

二.你可能遇到的问题

1.

解决方法是: cnpm i  @babel/preset-env

2.您可能需要适当的加载程序来处理此文件类型。

 解决方法是: 

const VueLoaderPlugin = require('vue-loader/lib/plugin');


//在插件中配置
new VueLoaderPlugin(),

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值