javascript - webpack2의 주문형 로딩이 적용되지 않는 이유는 무엇입니까?
世界只因有你
世界只因有你 2017-05-19 10:26:20
0
4
767

프런트엔드 모듈 개발에 막 참여하기 시작했습니다. 웹팩을 배우기 위해 데모를 작성했습니다. 기본적으로 구성 파일과 작업 프로세스를 이해하지만 주문형 로딩이 항상 실패합니다.

항목 파일에서는 3가지 방법을 사용하여 로드합니다.

으아아아

test.js의 내용은 매우 간단합니다. 콘솔에 인쇄하면 됩니다.

으아아아

세 가지 방법이 테스트되었습니다. 첫 번째 직접 가져오기 방법만 정상적으로 실행됩니다. 다른 두 가지 주문형 로드 방법은 해당 방법을 찾을 수 없다는 오류를 보고합니다.
코멘트 처리test.exe('显示测试文字');하고 로드만 하고 실행은 하지 않으면 오류가 보고되지 않습니다.
코드를 로드하는 데에는 아무런 문제가 없지만 로드해야 할 때 성공적으로 로드되지 않는 것으로 알고 있습니다. 이유는 무엇입니까? 제가 어딘가에 뭔가 잘못 쓴 걸까요? 아니면 webpack.config.jx에 추가 구성을 해야 합니까?

世界只因有你
世界只因有你

모든 응답(4)
淡淡烟草味

참고용으로 예를 들어보겠습니다

html

으아악

비동기적으로 로드해야 하는 JS 파일plugin.js

으아악

webpack의 항목 컴파일 파일 Entry.js

으아악

클릭 시 mod1.js가 로드되어 헤드에 삽입되는 효과가 있지만 처음에는 로드되지 않습니다

마지막으로 webpack.config.js 구성에 대해 말씀드리겠습니다.

으아악

path + ChunkFilename은 require.ensurei 비동기 모듈에 의해 생성된 경로이지만 html 파일이 참조하는 경로는 아닙니다

실제 참조 경로는 publicPath + ChunkFilename입니다. 즉, html이 프로젝트 루트 디렉터리에 있는 경우 이 비동기 js 모듈을 참조하는 html의 경로는 ./dist/js/async/[name입니다. ].js이지만 HTML이 index/index.html과 같은 폴더에 있거나 위 경로를 참조할 수 없는 경우 publickPath를 '../dist/'로 변경하고 index 폴더 외부로 이동해야 합니다. 비동기 모듈을 찾으려면

迷茫

최근에 비슷한 문제가 발생했는데 간단히 설명드리겠습니다.
webpack이 2로 업그레이드되면 두 번째 및 세 번째 크레딧 방법이 main.js에 직접 패키징되지 않습니다.
즉, 첫 번째 화면 로딩에 필요한 모듈의 경우 비동기 로딩 모드를 더 이상 사용할 수 없지만 요청 시 로드할 수 있습니다.
패키지 파일에서 확인할 수 있습니다. 첫 번째 방법을 제외하고는 테스트 방법이 js에 패키지되어 있지 않습니다.

Peter_Zhu

두 번째, 세 번째 글쓰기 방법은 어떻게 하고 싶으신가요? AMD 또는 CMD 사양의 작성 방법을 시뮬레이션하시겠습니까?

가장 일반적인 모듈 사양은 ES6 모듈과 node.js의 commonJS 사양인데, 로딩 시간, 파일 참조 방법 등 구체적인 로딩 세부 사항에 차이가 있기 때문입니다. 하지만 webpack을 사용하는 목적은 서로 다른 사양을 통일하기 위한 것입니다. Webpack은 모든 모듈
을 미리 함께 패키지화하고 각각 ID를 부여한 후 ID별로 참조하므로 ES6 모듈과 CommonJS 사양 간에 차이가 없습니다. webpack 컴파일 후 AMD 및 CMD 사양과 동일합니다.

포스터가 webpack을 사용하여 CMD의 지연 로딩을 구현하려는 경우 이 아이디어는 잘못된 것입니다. 왜냐하면 어떤 로딩 방법에 관계없이 webpack이 수행하는 작업은 의존하는(또는 의존할) 모든 모듈을 하나로 패키지하는 것이기 때문입니다. file 을 사용하여 런타임 시 해당 패키지를 ID로 찾을 수 있도록 하여 사양 간의 차이를 약화시킵니다

为情所困

귀하의 구체적인 환경은 모르겠습니다. 제 환경이 Webpack2 + React Router v4로 업그레이드되었습니다. https://reacttraining.cn/web/...

문서를 참조하세요.

먼저 필요에 따라 필요한 모듈과 구성 요소 파일을 로드하기 위해 번들 구성 요소를 코딩하고 생성해야 합니다.

으아악

위 코드는 문서에서 복사한 것이며, 상태 초기화 방법을 수정하지 않은 경우에는 babel-plugin-transform-class-properties를 사용해야 합니다.babel-plugin-transform-class-properties.

使用的时候包含三个个步骤

  • 导入Bundle模块

import React, { Component } from 'react'

class Bundle extends Component {
  constructor(props){
    super(props)
    this.state = {
      mod: null
    }
  }
  componentWillMount() {
    this.load(this.props)
  }
  componentWillReceiveProps(nextProps) {
    if (nextProps.load !== this.props.load) {
      this.load(nextProps)
    }
  }
  load(props) {
    this.setState({
      mod: null
    })
    props.load((mod) => {
      this.setState({
        // handle both es imports and cjs
        mod: mod.default ? mod.default : mod
      })
    })
  }
  render() {
    return this.props.children(this.state.mod)
  }
}

export default Bundle
  • 异步加载

import Bundle from './bundle.js';
  • 初始化

import loadHome  from 'bundle-loader?lazy!./components/Home';

当然, 你还需要配置你的 .babelrcwebpack.config.js, 下面我给我我自己的, 你可以研究一下.

webpack.config.js

const Home = ({...props}) => (
  <Bundle load={loadHome}>
    {(Component) => Component? <Component {...props}/>: <p>Loading...</p>}
  </Bundle>
)

.babelrc

  module: {
    rules: [
      // Javascript模块加载器
      {
        test: /\.js|jsx$/,
        exclude: /(node_modules|bower_components)/,
        use: {
          loader: 'babel-loader',
          options: {
            cacheDirectory : true,
            presets: [
              ['es2015', {modules: false}]
            ],
            plugins: [
              'syntax-dynamic-import',
              'transform-async-to-generator',
              'transform-regenerator',
              'transform-runtime'
            ]
          }
        }
      },
      ...
    ]

还有公共块输出插件的配置

{
  "presets": [
    "es2017",
    [
      "latest",
      {"es2015":{"modules": false}}
    ],
    "stage-0",
    "react"
  ],
  "plugins": [
    ["import",{"libraryName": "antd","style": true }],
    "react-hot-loader/babel"
  ]
}

通过上述N个步骤后, 组件Home

사용에는 세 가지 단계가 있습니다🎜
  • 🎜번들 모듈 가져오기🎜
으아악
  • 🎜비동기 로딩🎜
으아악
  • 🎜초기화🎜
으아악 🎜물론, .babelrcwebpack.config.js도 구성해야 합니다. 아래에서 직접 제공할 것이므로 공부하시면 됩니다.🎜 🎜webpack.config.js🎜 으아악 🎜.babelrc🎜 으아악 🎜공개 블록 출력 플러그인 구성도 있습니다🎜 으아악 🎜위의 N단계를 통과하면 Home 컴포넌트를 사용할 수 있습니다.🎜
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿