vue-cli 脚手架详解

webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序须要的每一个模块,而后将全部这些模块打包成一个或多个 bundle。javascript

经过vue-cli构建的webpack-vue项目css

npm install --global vue-cli
vue init webpack my-project
复制代码

项目结构

  • build build中是一些webpack的相关配置,包括基本配置、开发环境配置、生产环境配置等
  • config 针对开发环境、生产环境、测试环境的配置信息
  • node-modules package.json构建出的包
  • src
  • static 不会被webpack处理 webpack打包后,此目录下的文件会默认被复制到dist/static中,这是经过build.assetsPublicPath和buildSubDirectory来肯定的
  • .babelrc 用来配置babel
  • .editorconfig 在不一样的编辑器和IDE之间定义和维护一致的代码风格
  • .gitignore git pull时候要忽略的文件
  • .postcssrc.js 配置postcss .vue-loader的postcss会默认读取这个文件
  • index.html 入口文件
  • package-lock.json 制定了每一个模块及其每一个依赖项的版本位置和完整哈希。因此不管是用什么设备(跨平台)执行npm install 安装的依赖都是相同的
  • package.json 依赖
  • README.MD 备注

build

webpack的相关配置,包括基本配置、开发环境配置、生产环境配置等

【webpack.base.conf.js 】

一些概念html

__dirname:    得到当前执行文件所在目录的完整目录名
__filename:   得到当前执行文件的带有完整绝对路径的文件名
process.cwd():得到当前执行node命令时候的文件夹目录名 
./:           文件所在目录
../:          文件所在的上级目录
/:            文件所在的根目录
复制代码
path.dirname() 方法返回 path 的目录名
path.dirname('/foo/bar/baz/asdf/quux');
// 返回: '/foo/bar/baz/asdf'
复制代码
path.join([...paths])方法使用平台特定的分隔符做为定界符将全部给定的 path 片断链接在一块儿,而后规范化生成的路径。
path.join('/foo', 'bar', 'baz/asdf', 'quux', '..');
// 返回: '/foo/bar/baz/asdf'

path.join('foo', {}, 'bar');
// 抛出 'TypeError: Path must be a string. Received {}'
复制代码

【webpack.base.conf.js】内容以下vue

const path = require('path'); //require是Node.js全局函数
const ROOT = path.dirname(__dirname); 
const SRC = path.join(ROOT, 'src');
const DIST = path.join(ROOT, 'dist');

module.exports = {
    entry: { //入口起点(entry point)指示 webpack 应该使用哪一个模块,来做为构建其内部依赖图的开始。进入入口起点后,webpack 会找出有哪些模块和库是入口起点(直接和间接)依赖的。
        index: path.join(SRC, 'index', 'js', 'index.js'),
        payresult: path.join(SRC, 'payresult', 'js', 'index.js'),
        paysuccess: path.join(SRC, 'paysuccess', 'js', 'index.js')
    },
    output: { //output 属性告诉 webpack 在哪里输出它所建立的 bundles,以及如何命名这些文件,默认值为 ./dist。基本上,整个应用程序结构,都会被编译到你指定的输出路径的文件夹中。你能够经过在配置中指定一个 output 字段,来配置这些处理过程:
        filename: '[name].js',
        path: path.join(DIST),
        publicPath: '/',
    },
    //loader 让 webpack 可以去处理那些非 JavaScript 文件(webpack 自身只理解 JavaScript)。loader 能够将全部类型的文件转换为 webpack 可以处理的有效模块,本质上,webpack loader 将全部类型的文件,转换为应用程序的依赖图(和最终的 bundle)能够直接引用的模块。
    //在更高层面,在 webpack 的配置中 loader 有两个目标:test 属性,用于标识出应该被对应的 loader 进行转换的某个或某些文件。use 属性,表示进行转换时,应该使用哪一个 loader。例如{ test: /\.txt$/, use: 'raw-loader' },当webpack编译器碰到「在 require()/import 语句中被解析为 '.txt' 的路径」时,对它打包以前,先使用 raw-loader 转换一下。”
    module: {
        rules: [
            {
                test: /\.vue$/,
                loader: 'vue-loader',
                options: {
                    loaders: {
                        'less': 'vue-style-loader!css-loader!postcss-loader!less-loader',
                    }
                }
            },
            {
                test: /\.js$/,
                loader: 'babel-loader',
                exclude: /node_modules/ //include 表示哪些目录中的 .js 文件须要进行 babel-loader;exclude 表示哪些目录中的 .js 文件不要进行 babel-loader 
            },
            {
                test: /\.(png|jpg|jpeg|gif|svg)$/,
                loader: 'file-loader',
                options: {
                    name: 'img/[name].[hash:7].[ext]'
                }
            },
            {
                test: /\.less$/,
                use: [
                    {
                        loader: "style-loader" // creates style nodes from JS strings
                    },
                    {
                        loader: "css-loader" // translates CSS into CommonJS
                    },
                    {
                        loader: "postcss-loader"
                    },
                    {
                        loader: "less-loader" // compiles Less to CSS
                    }
                ]
            },
            {
                test: /\.css$/,
                loader: "style-loader!css-loader"
            },
            {
                test: /\.(eot|woff|woff2|ttf)([\\?]?.*)$/,
                loader: "file-loader"
            },
        ]
    },
    resolve: {//解析模块的可选项
        alias: { // 模块别名列表
            'vue$': 'vue/dist/vue.esm.js',
        }
    },
};
复制代码

config

index.js

const path = require('path');

module.exports = {
    build: {
        env: require('./prod.env'),
        index: path.resolve(__dirname, '../dist/index.html'),
        assetsRoot: path.resolve(__dirname, '../dist'),
        assetsSubDirectory: '',
        assetsPublicPath: './',
        productionSourceMap: true,
        productionGzipExtensions: ['js', 'css'],
        bundleAnalyzerReport: process.env.npm_config_report
    },
    dev: {
        env: require('./dev.env'),
        assetsSubDirectory: 'static',
        assetsPublicPath: '/',
        proxyTable: {
            '/api': {
                target: 'http://api.bilibili.com',
                changeOrigin: true,
                pathRewrite: {
                    '^/api': '/api'
                }
            },
            '/payplatform': {
                target: 'http://pay.bilibili.com',
                // target:'http://10.23.144.52:8101',
                changeOrigin: true,
                pathRewrite: {
                    '^/payplatform': '/payplatform'
                }
            },
            '/userAuth': {
                target: 'http://pay.bilibili.com',
                // target:'http://10.23.145.204:80',
                changeOrigin: true,
                pathRewrite: {
                    '^/userAuth': '/userAuth'
                }
            },
            '/paywallet': {
                target: 'http://pay.bilibili.com',
                // target:'http://10.23.144.14:8081',
                changeOrigin: true,
                pathRewrite: {
                    '^/paywallet': '/paywallet'
                }
            }
        }
    }
};
复制代码

.postcssrc.js

postcss是一个平台,这个平台能够开发一些插件来处理css。例如autoprefixer:为css中的属性添加浏览器特定的前缀;
module.exports = {
  "plugins": {
    "postcss-import": {},
    "postcss-url": {},
    // to edit target browsers: use "browserslist" field in package.json
    "autoprefixer": {
        browsers: ["Android 4.0", "iOS 7.1", "Chrome > 31", "ff > 31", "ie >= 10"]
    } //若是package.json有配置browserslist,autoprefixer会读取package.json下的browserslist配置
  }
}
复制代码

package.json配置browserslistjava

"browserslist": [
    "> 1%",
    "last 2 versions",
    "not ie <= 8"
]
复制代码

.editorconfig

root = true
[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
复制代码
相关文章
相关标签/搜索